sycl : --split-mode tensor 지원 ([#24152](https://github.com/ggml-org/llama.cpp/pu
요약
llama.cpp의 SYCL 백엔드에서 듀얼 GPU를 위한 텐서 병렬성(--split-mode tensor) 지원이 추가되었습니다. 데이터 크기에 따라 FP32 직접 복사 또는 BF16 압축 방식을 선택하여 PCIe 대역폭 효율을 최적화합니다.
핵심 포인트
- SYCL 기반 텐서 병렬성(Tensor Parallelism) 구현
- 데이터 크기에 따른 최적화 경로(FP32 vs BF16 압축) 제공
- PCIe 대역폭 사용량을 절반으로 줄여 대규모 텐서 처리 성능 향상
- Intel Arc Pro B70 환경에서 Llama-3.3-70B 추론 속도 대폭 개선
sycl : --split-mode tensor 지원 (#24152)
-
Sycl tp stage1 (#1)
-
SYCL: 듀얼 GPU를 위한 텐서 병렬성 (tensor parallelism, --split-mode tensor)
ggml-cuda.cu에서 사용되는 패턴을 미러링하여, 백엔드별 all-reduce를 활성화하기 위해 meta-backend가 get_proc_address를 통해 쿼리하는 comm_init/comm_free/comm_allreduce_tensor 트리오를 추가합니다.
N=2 (일반적인 듀얼 GPU 케이스)의 경우, 두 가지 크기 분기 경로를 가진 퇴화된 링 all-reduce (degenerate ring all-reduce)를 구현합니다:
-
작은 크기 (nelem < 32768): FP32 직접 memcpy + depends_on(memcpy_event)를 통해 체이닝된 디바이스별 ADD 커널. 호출당 4개의 SYCL submission.
-
큰 크기 (nelem >= 32768): BF16 압축 방식. 각 디바이스는 로컬 outbox에서 FP32 -> BF16으로 압축하고, 피어(peer)의 inbox로 디바이스 간 memcpy를 수행하며 (PCIe 바이트 수 절반), 그 후 로컬 FP32 부분합으로 압축 해제 및 더하기를 수행합니다. 호출당 6개의 SYCL submission이 발생하지만 PCIe 바이트가 절반으로 줄어듭니다. 이는 커널 시간에서 PCIe가 지배적인 모든 텐서에 대해 이점을 가집니다.
임계값(Threshold) 및 BF16 경로 패턴은 CUDA NCCL allreduce를 미러링합니다.
스토리지: 디바이스당 하나의 지속적인 uint8_t 버퍼, 4 * nelem 바이트 (두 경로 레이아웃 모두 일치: FP32 nelem floats; BF16 outbox+inbox = 각각 2 * nelem uint16_t).
디바이스당 단일 할당(alloc)+해제(free)를 통해 SYCL 풀의 엄격한 LIFO 불변성을 단순하게 유지합니다.
초기 구현은 N=2 FP32 연속 텐서를 처리합니다. 다른 케이스는 false를 반환하여 meta-backend가 일반적인 butterfly fallback을 사용하도록 합니다.
호출당 동기화(sync)는 의도적으로 생략되었습니다. SYCL의 in-order queue 의미론(semantics)은 동일한 디바이스별 큐에 대한 meta-backend의 다음 연산이 우리의 최종 ADD를 기다리도록 보장하며, 동일한 지속적 버퍼에 대한 다음 allreduce의 첫 번째 연산도 동일한 큐를 통해 대기하게 합니다. 오직 comm_free만이 명시적인 최종 대기(wait)를 수행합니다.
OneCCL은 사용되지 않습니다: OneCCL 2021.17은 communicator_impl.hpp:47에서 프로세스당 단일 장치(single-device-per-process)를 하드코딩하고 있으며 (condition devices.size() == 1), 이는 llama.cpp의 단일 프로세스 멀티 GPU (single-process multi-GPU) 모델과 호환되지 않습니다.
듀얼 Intel Arc Pro B70 (NEO 26.05.x, oneAPI 2025.3 + DPC++ nightly)에서 측정됨:
Llama-3.3-70B Q4_K_M, -sm tensor -fa 1 -ctk f16 -ctv f16:
pp512 = 377.08 t/s (vs 313.65 layer mode = +20.2%)
tg128 = 17.40 t/s (vs 9.74 layer mode = +78.6%)
Qwen3-Coder-Next-80B-A3B Q3_K_M (MoE):
pp512 = 216.56 t/s (vs 156.58 meta-backend butterfly = +38.3%)
tg128 = 17.60 t/s (vs 14.31 meta-backend butterfly = +23.0%)
Qwen3-4B Q4_K_M:
pp64 = 984.51 t/s, tg16 = 49.29 t/s
SYCL TP 환경의 Llama-3.3-70B는 이제 프리필 (prefill)과 디코드 (decode) 모두에서 프로덕션 레이어 모드 (production layer mode)를 여유롭게 능가합니다. Coder-Next-80B-A3B (MoE) 또한 두 영역 모두에서 승리했습니다. BF16 경로가 다중 중간 allreduce (many-medium-allreduces) 프리필 패턴을 가능하게 합니다.
빌드/CMake (Build/CMake): 변경 사항 없음. 새로운 의존성 없음. ggml-sycl.h 및 ggml-sycl.cpp에 걸쳐 약 210행 추가됨.
- 주석 수정
- PR 피드백을 반영한 문서 업데이트
- 나의 장치 간 메모리 복사 (device-to-device memcpy) 변경 사항 반영
- dev2dev_memcpy 호출을 업스트림의 7개 파라미터 버전으로 이동
- 오타 수정 및 마지막 공백 제거
macOS/iOS:
- macOS Apple Silicon (arm64)
- macOS Apple Silicon (arm64, KleidiAI 활성화) 비활성화됨
- macOS Intel (x64)
- iOS XCFramework
Linux:
Linux:
- Ubuntu x64 (CPU)
- Ubuntu arm64 (CPU)
- Ubuntu s390x (CPU)
- Ubuntu x64 (Vulkan)
- Ubuntu arm64 (Vulkan)
- Ubuntu x64 (ROCm 7.2)
- Ubuntu x64 (OpenVINO)
- Ubuntu x64 (SYCL FP32)
- Ubuntu x64 (SYCL FP16)
Android:
Windows:
Windows:
- Windows x64 (CPU)
- Windows arm64 (CPU)
- Windows arm64 (OpenCL Adreno)
- Windows x64 (CUDA 12) - CUDA 12.4 DLLs
- Windows x64 (CUDA 13) - CUDA 13.3 DLLs
- Windows x64 (Vulkan)
- Windows x64 (OpenVINO)
- Windows x64 (SYCL)
- Windows x64 (HIP)**
openEuler:
- DISABLED
- openEuler x86 (310p)
- openEuler x86 (910b, ACL Graph)
- openEuler aarch64 (310p)
- openEuler aarch64 (910b, ACL Graph)**
UI:
AI 자동 생성 콘텐츠
본 콘텐츠는 llama.cpp Releases의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기