본문으로 건너뛰기

© 2026 Molayo

llama.cpp헤드라인2026. 05. 14. 18:53

SYCL: Level Zero 할당을 사용하여 멀티 GPU 시스템 RAM 고갈 문제 수정 ( #21597 ) SYCL: Level Zero 할당

요약

본 기술 기사는 SYCL 백엔드에서 GPU 메모리 할당 방식을 개선하고, 특히 Intel Arc Pro B70과 같은 멀티 GPU 시스템에서 발생했던 시스템 RAM 고갈(OOM) 문제를 해결한 내용을 다룹니다. 기존의 `sycl::malloc_device`는 VRAM 할당을 시스템 RAM에 1:1로 미러링하여 과도한 메모리 소비를 유발했지만, 새로운 `zeMemAllocDevice` 사용은 호스트 스테이징 없이 P2P 경로를 사용하여 시스템 RAM 사용량을 크게 줄였습니다. 또한, 코드의 안정성과 유지보수성을 높이기 위해 try/catch 제거, 공통 헬퍼 함수 통합, 그리고 Level Zero 지원을 위한 컴파일 및 런타임 플래그 추가 등의 리팩토링 작업도 진행되었습니다.

핵심 포인트

  • `sycl::malloc_device` 대신 `zeMemAllocDevice`를 사용하여 멀티 GPU 시스템의 시스템 RAM 고갈 문제를 해결했습니다.
  • 새로운 할당 방식은 호스트 스테이징(host staging) 없이 P2P 경로를 사용함으로써 메모리 효율성을 극대화합니다.
  • 코드 안정성 향상을 위해 try/catch 구문을 제거하고, 백엔드 및 디바이스 유형을 사전에 확인하는 방식으로 변경했습니다.
  • Level Zero 지원 여부를 제어하기 위한 컴파일 타임(`GGML_SYCL_SUPPORT_LEVEL_ZERO`) 및 런타임 환경 변수(`GGML_SYCL_ENABLE_LEVEL_ZERO`)가 추가되었습니다.
  • CI/CD 환경에서 Level Zero SDK 설치를 추가하고, GPU 장치만 정확히 확인하도록 로직을 수정하여 멀티 GPU 시스템의 안정성을 확보했습니다.

SYCL: Level Zero 할당을 사용하여 멀티 GPU 시스템 RAM 고갈 문제 수정 ( #21597 ) SYCL: Level Zero 할당을 사용하여 멀티 GPU 시스템 RAM 고갈 문제 수정

SYCL 백엔드에서 GPU 메모리 할당을 위해 sycl::malloc_device를 zeMemAllocDevice로 교체합니다. sycl::malloc_device는 xe 커널 드라이버의 DMA-buf/TTM 경로를 트리거하여 모든 VRAM 할당을 시스템 RAM에 1:1로 미러링합니다. zeMemAllocDevice는 호스트 스테이징 (host staging)이 없는 SVM/P2P 경로를 사용합니다. 듀얼 Intel Arc Pro B70 시스템 (64GB VRAM, 64GB RAM)에서 15.6 GiB 모델이 sycl::malloc_device를 통해 60 GiB의 시스템 RAM을 소비하여 OOM (Out of Memory) 충돌을 일으켰습니다. zeMemAllocDevice를 사용하면 동일한 워크로드가 성능 저하 없이 약 6.7 GiB의 시스템 RAM만 사용합니다. 모든 Level Zero 호출은 Level Zero 상호 운용성 (interop)을 사용할 수 없는 경우 원래의 SYCL 할당 경로로 자동 폴백 (fallback)되도록 포함됩니다.

SYCL: 리뷰 피드백 반영 - try/catch 제거, 디바이스 유형 확인, 중복 제거

malloc/free/memcpy 헬퍼에서 try/catch를 제거하고, 대신 백엔드 및 디바이스 유형을 사전에 확인합니다 (ggml_sycl_is_level_zero, ggml_sycl_is_dgpu). 공유 헬퍼 (is_level_zero, is_dgpu, free_device)를 common.cpp로 이동하고 common.hpp에 선언하여 코드 중복을 제거합니다. 폴백 sycl::free 호출에는 SYCL_CHECK(CHECK_TRY_ERROR())를 사용합니다. dev2dev_memcpy L0 경로를 dGPU-to-dGPU로만 제한하여, iGPU-to-dGPU 전송을 위한 호스트 스테이징 경로를 보존합니다. CMakeLists.txt에 Windows Level Zero SDK 경로 탐지 (LEVEL_ZERO_V1_SDK_PATH)를 추가했습니다 (@arthw 공동 작성).

SYCL: Level Zero를 위한 빌드/런타임 플래그 추가, 리뷰 피드백 반영

@arthw가 제안한 아키텍처를 구현합니다: Level Zero와 SYCL 메모리 API 경로를 깔끔하게 분리하기 위한 컴파일 타임 및 런타임 플래그입니다. GGML_SYCL_SUPPORT_LEVEL_ZERO cmake 옵션을 추가합니다 (기본값 ON). 모든 Level Zero 코드는 #ifdef로 감싸져 있어 Level Zero SDK가 설치되지 않은 시스템(예: CPU 전용 CI 서버)에서도 빌드가 작동합니다. 로더 라이브러리와 헤더 모두 활성화 전에 확인됩니다. GGML_SYCL_ENABLE_LEVEL_ZERO 런타임 환경 변수를 추가합니다 (기본값 1).

Level Zero 또는 SYCL 메모리 API 사용 여부를 제어합니다. 세션당 하나의 API 스타일만 사용되며, 혼용할 수 없습니다. Level Zero가 활성화되어 있지만 장치가 Level Zero 백엔드를 지원하지 않는 경우, 경고와 함께 자동으로 비활성화됩니다. 사용되지 않았던(백엔드 어디에서도 dpct::device_memory가 호출되지 않음) dpct_malloc에서 Level Zero 코드를 제거했습니다. 또한 흐름 제어를 위해 사용되었던 try/catch를 제거했습니다. 두 가지 새로운 파라미터에 대한 문서를 SYCL.md에 업데이트했습니다. Intel Arc Pro B70 (32GB)에서 단일 GPU 및 듀얼 GPU 환경으로, GGML_SYCL_SUPPORT_LEVEL_ZERO=ON 및 OFF 빌드 모두에서 테스트를 완료했습니다. AI 지원 개발 (Claude). 내 하드웨어에서 코드 리뷰 및 테스트를 완료했습니다. SYCL: Level Zero malloc/free 호출 지점 통합, 리뷰 피드백 반영. ggml_sycl_malloc_device를 ggml_sycl_free_device와 함께 common.cpp로 이동했습니다. 이제 두 함수 모두 조건 없이 사용 가능합니다. Level Zero 코드는 호출 지점이 아닌 함수 내부에서 #ifdef로 처리됩니다. 모든 호출 지점은 #ifdef 블록 없이 uniform SYCL_CHECK(CHECK_TRY_ERROR()) 래핑을 사용합니다. arthw의 리뷰 사항 반영: 실패 시 스택 트레이스(stack trace)를 위해 모든 malloc/free를 SYCL_CHECK로 감싸고, 6개 호출 지점의 중복된 #ifdef/else 패턴을 제거했습니다 (-29라인 순감소). Co-Authored-By: Claude Opus 4.6 (1M context) noreply@anthropic.com SYCL: CI에 Level Zero SDK 추가, 장치 확인 및 누락된 할당 경로 수정. Level Zero 코드 경로가 CI에서 컴파일되고 테스트될 수 있도록 Ubuntu 및 Windows SYCL CI 작업에 Level Zero SDK 설치를 추가했습니다. 확장된 듀얼 GPU 테스트(ONEAPI_DEVICE_SELECTOR가 설정되지 않은 상태) 중에 발견된 두 가지 버그를 수정했습니다: 1. Level Zero 백엔드 확인 시 CPU를 포함한 모든 SYCL 장치를 순회하던 문제를 수정했습니다. OpenCL CPU 장치로 인해 GPU에 대한 Level Zero가 비활성화되어 멀티 GPU 시스템에서의 수정 사항이 무력화되는 문제가 있었습니다. is_gpu() 필터를 추가하여 GPU 장치만 확인하도록 했습니다. 2. sycl_ext_malloc_device/sycl_ext_free (텐서 재정렬 임시 버퍼)가 여전히 sycl::malloc/sycl::free를 직접 호출하여 Level Zero 경로를 우회하던 문제를 수정했습니다. 다른 장치 메모리 호출 지점과의 일관성을 위해 ggml_sycl_malloc_device/free_device를 거치도록 경로를 변경했습니다.

Co-Authored-By: Claude Opus 4.6 (1M context) noreply@anthropic.com

SYCL: Level Zero 메모리 API 구조에 대한 arthw의 리뷰 피드백 반영

  • ggml_sycl_malloc_device를 ggml-sycl.cpp 내의 정적 함수 (static function)로 이동; (common.cpp에서 사용되는) ggml_sycl_free_device만 common.cpp에 유지
  • 두 헬퍼 (helper) 함수 모두 호출 시마다 큐 백엔드 (queue backend)를 확인하는 대신 g_ggml_sycl_enable_level_zero 전역 변수를 사용하도록 전환
  • 전역 정의에서 #ifdef 래퍼 (wrapper) 제거; 항상 0으로 선언하고, L0가 컴파일되지 않았을 때 0으로 유지되도록 init 블록에 #else 분기 추가
  • GPU 전용 장치 확인을 설명하도록 init 루프 주석 업데이트
  • CMakeLists: if 블록 이전에 message(STATUS) 추가; 옵션 문구 정렬

AI 보조 구현. Dual Intel Arc Pro B70 (각 32 GB)에서 검토 및 테스트 완료:

  • 두 GPU 모두에서 test-backend-ops OK
  • 단일/듀얼 GPU Q4_K_M 및 Q8_0 벤치마크 결과 정확함
  • zeMemAllocDevice GTT 델타(delta)가 4 GiB 할당당 5 MiB 미만임을 확인 (sycl::malloc_device 사용 시 약 4 GiB의 섀도우(shadow) 발생 대비)

Co-Authored-By: Claude Sonnet 4.6 noreply@anthropic.com

SYCL: common.cpp에서 사용되지 않는 cstdio/cstdlib include 제거

  • 삭제된 ggml_sycl_queue_supports_level_zero 헬퍼의 잔재 제거

Co-authored-by: Claude Sonnet 4.6 noreply@anthropic.com 코드 리뷰 제안 사항 적용
Co-authored-by: Neo Zhang zhang.jianyu@outlook.com
SYCL: 초기 malloc 동안 Level Zero 할당 경로 보존
ci: Intel Docker 빌드에서 Level Zero 패키지 충돌 수정
ci: oneAPI 패키지 단계에서 Level Zero 로더 탐색
ci: Level Zero DLL이 없는 Windows SYCL 패키지 허용
Co-authored-by: Claude Opus 4.6 (1M context) noreply@anthropic.com
Co-authored-by: Neo Zhang zhang.jianyu@outlook.com
macOS/iOS: macOS Apple Silicon (arm64)
macOS Apple Silicon (arm64, KleidiAI 활성화)
macOS Intel (x64)
iOS XCFramework
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: Android arm64 (CPU)
Windows: Windows x64 (CPU)
Windows arm64 (CPU)
Windows x64 (CUDA 12) - CUDA 12.4 DLLs
Windows x64 (CUDA 13) - CUDA 13.1 DLLs
Windows x64 (Vulkan)
Windows x64 (SYCL)
Windows x64 (HIP)
openEuler: openEuler x86 (310p)
openEuler x86 (910b, ACL Graph)
openEuler aarch64 (310p)
openEuler aarch64 (910b, ACL Graph)

AI 자동 생성 콘텐츠

본 콘텐츠는 llama.cpp Releases의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.

원문 바로가기
0

댓글

0