Apple Silicon macOS VMs: Accelerating LLM Inference with Metal Capability Shim

Metal 기능을 해제하여 macOS VM 내 LLM 추론 속도를 11-16배 향상

Apple의 Virtualization.framework를 사용하는 macOS 게스트 내에서 llama.cpp를 통해 대규모 언어 모델(LLM)을 실행하는 것은 가상 GPU가 보수적인 기능 프로필을 보고하기 때문에 베어메탈 성능보다 훨씬 느립니다. 프로세스 범위의 호환성 심(shim)을 사용하여 최신 Metal 기능을 보고함으로써, M1 Ultra에서 TinyLlama 1.1B의 프롬프트 처리 속도는 11.08x, 토큰 생성 속도는 16.36x 향상되었습니다.

이러한 성능 향상은 심(shim)이 llama.cpp가 호스트 하드웨어는 지원하지만 가상 장치는 일반적으로 숨기는 최신 Metal 커널(예: SIMD-group matrix 및 bfloat16 경로)을 선택할 수 있도록 해주기 때문에 발생합니다.

근본 원인: 반가상화된 GPU 기능 제한

Apple의 Virtualization.framework는 반가상화(paravirtualization)를 사용하며, 게스트의 가상 그래픽 장치가 호스트의 물리 GPU에서 실행되는 전용 드라이버에 작업을 제출하는 방식입니다. 일부 Linux 환경에서 사용되는 PCI 패스스루(VFIO)와 달리, 호스트는 하드웨어에 대해 엄격한 제어권을 유지합니다.

기본 macOS VM에서 가상 장치는 최대 스레드그룹 메모리가 32 KB에 불과한 Apple 5세대 급의 기능 프로필을 보고합니다. 최신 Metal 애플리케이션은 가장 효율적인 커널을 선택하기 위해 실행 시점에 장치를 쿼리하므로, llama.cpp는 실제 물리적 Apple Silicon GPU가 훨씬 더 많은 기능을 수행할 수 있음에도 불구하고 이러한 보수적인 보고를 바탕으로 느린 레거시 경로를 기본값으로 사용하게 됩니다.

해결책: 프로세스 범위의 Metal 기능 심(Shim)

이러한 제한을 우회하기 위해 Cua는 애플리케이션과 API 사이에 삽입되는 호환 레이어인 Metal 기능 심을 개발했습니다. 이 심은 특정 게스트 프로세스에 대한 Metal 기능 쿼리를 가로채고 반환된 값을 수정하여 고성능 경로를 활성화합니다.

주요 기능 변경 사항

기능 기본 게스트 해제된 프로필
supportsFamily:1009 False True
SIMD-group matrix Off On
SIMD-group reduction Off On
bfloat16 Off On
Max threadgroup memory 32 KB 64 KB

이 심은 특히 Apple family 9(1009)까지 supportsFamily:에 응답하며, 보고되는 최대 스레드그룹 메모리를 64 KB로 두 배 늘립니다. 이는 게스트 커널이나 물리 GPU 할당을 변경하지 않고도 llama.cpp에서 새로운 SIMD-group 및 bfloat16 경로의 선택을 트리거하기에 충분합니다.

성능 벤치마크

테스트는 macOS 26.6.1이 실행되는 Apple M1 Ultra (48-core GPU)에서 Lume 0.5.1의 게스트 Tahoe 이미지 (macOS 26.5.2)를 사용하여 수행되었습니다.

TinyLlama 1.1B (Q4_K_M)

워크로드 베어메탈 호스트 기본 게스트 해제된 게스트 게스트 속도 향상
프롬프트 처리 (512 tok) 4,871.99 tok/s 431.86 tok/s 4,786.70 tok/s 11.08x
토큰 생성 (128 tok) 286.71 tok/s 12.63 tok/s 206.60 tok/s 16.36x

해제된 VM에서의 프롬프트 처리 속도는 베어메탈 속도의 98.25%에 도달했습니다.

Gemma 4 12B (QAT Q4_0)

워크로드 베어메탈 호스트 기본 게스트 해제된 게스트 게스트 속도 향상
프롬프트 처리 (512 tok) 517.88 tok/s 71.66 tok/s 515.76 tok/s 7.20x
토큰 생성 (128 tok) 52.38 tok/s 3.41 tok/s 49.67 tok/s 14.54x

MLX-LM 호환성

MLX-LM 0.31.3 및 Llama-3.2-3B-Instruct-4bit를 사용한 테스트 결과 성능 차이가 거의 없었습니다 (약 1.0배 비율). 이는 MLX-LM이 이미 기본 VM에서 효율적인 경로를 사용하고 있음을 나타내며, 개발자들이 반가상화된 장치가 지원할 수 없는 residency sets를 요청하지 않도록 심을 개선하는 데 도움이 되었습니다.

배포 및 구현

이 심은 Cua 저장소의 libs/lume/metal-capability-shim 디렉토리에 연구 산물로 공개되어 있습니다. 구현에는 다음 단계가 필요합니다:

  1. Build: 제공된 빌드 스크립트를 사용하여 아키텍처별 dylibs를 컴파일합니다.
  2. Host Configuration: 호스트 터미널을 통해 제한 없는 기능 수준을 활성화합니다: defaults write com.apple.gpusw.ParavirtualizedGraphics ForceUnrestrictedDeviceFeatureLevel -bool true
  3. Injection: DYLD_INSERT_LIBRARIES를 사용하여 게스트에서 워크로드를 실행하여 해당 특정 프로세스에 심을 적용합니다.

한계 및 기술적 제약

  • 버전 민감도: 이 심은 게스트의 비공개 Metal 구현 세부 사항에 의존하므로 macOS 릴리스 간에 작동이 중단될 수 있습니다.
  • 프로세스 범위: 주입된 프로세스와 그 자식 프로세스에만 영향을 미칩니다. 보안이 강화된(hardened) 바이너리는 라이브러리 주입을 거부할 수 있습니다.
  • 가상화 오버헤드: GPU 커널을 활성화하지만, Virtualization.framework 브리지의 고유한 오버헤드를 제거하지는 않습니다.
  • 제한된 검증: 결과는 현재 M1 Ultra 및 Tahoe 게스트에 대해 검증되었습니다. 다른 Apple Silicon 세대는 독립적인 테스트가 필요합니다.

커뮤니티 관점

기술 사용자들 사이의 논의에 따르면, 이것은 모든 Mac 사용자를 위한 일반적인 llama.cpp 속도 향상이 아니라, Virtualization.framework VM 내에서 추론을 실행하는 사용자들을 위한 특정 수정 사항입니다. 일부 사용자들은 하드웨어는 매우 유능하지만 소프트웨어 추상화 계층이 보수적이라는 점을 언급하며, 왜 Apple가 VM에서 Metal 프로필을 제한하는지에 대해 의문을 제기했습니다.

Sources

관련