CUDA: AMD MFMA 하드웨어에서 batch>=4인 양자화된 matmul을 MMQ로 라우팅 ([#23227](https://github.c
요약
llama.cpp 프로젝트에서 AMD MFMA 하드웨어를 위한 양자화된 matmul 라우팅 최적화 패치가 적용되었습니다. 양자화 방식별로 최적의 배치 임계값을 다르게 설정하여 AMD CDNA 아키텍처에서의 추론 성능을 대폭 향상시켰습니다.
핵심 포인트
- AMD MFMA 하드웨어에서 양자화 방식별 맞춤형 배치 임계값 도입
- K-quants 방식 사용 시 batch=4부터 MMQ 라우팅으로 성능 최대 76% 향상
- 양자화 유형에 따른 역양자화 비용을 고려한 정밀한 커널 선택 로직 구현
- MI250X 환경에서 Llama-3.2-3B 모델로 성능 개선 검증 완료
CUDA: AMD MFMA 하드웨어에서 batch>=4인 양자화된 matmul을 MMQ로 라우팅 (#23227)
- CUDA: AMD MFMA 하드웨어에서 양자화 방식별 MMVQ/MMQ 배치 임계값(batch threshold) 적용
기존 디스패처(dispatcher)는 양자화된 matmul (quantized matmul)을 위해 mul_mat_vec_q (행별 GEMV)와 mul_mat_q (MFMA-tiled GEMM) 사이를 선택할 때 단일 전역 임계값(MMVQ_MAX_BATCH_SIZE = 8)을 사용했습니다. AMD CDNA에서는 양자화 제품군(quant family)에 따라 최적의 교차 지점(crossover)이 크게 달라지는데, 이는 행별 GEMV 비용이 점곱(dot-product) 자체보다 역양자화(dequantisation)에 의해 좌우되기 때문입니다. K-quants는 더 무거운 슈퍼 블록 디코딩(super-block decode) 비용이 발생하므로 MMQ가 더 빨리 유리해지며, legacy 및 IQ quants는 디코딩 비용이 적어 배치가 MFMA 타일을 완전히 채울 때까지 MMVQ가 우위를 유지합니다.
이 패치는 기존의 ggml_cuda_should_use_mmq를 미러링하는 ggml_cuda_should_use_mmvq(type, cc, ne11) -> bool을 도입하며, amd_mfma_available(cc) 조건에 따라 양자화 방식별 임계값을 제어합니다:
Q3_K, Q4_K, Q5_K : MMVQ <= 3 (batch=4부터 MMQ가 유리: +5% .. +76%)
Q2_K, Q6_K : MMVQ <= 5 (batch=6부터 MMQ가 유리: +8% .. +35%)
기타 : MMVQ <= 8 (legacy & IQ는 MMQ 사용 시 성능 저하; 변경 없음)
Non-AMD-MFMA 경로(NVIDIA, RDNA, MFMA가 없는 CDNA1)는 master 브랜치와 바이트 단위로 동일합니다. GGML_CUDA_FORCE_MMVQ=1을 설정하면 A/B 테스트를 위해 기존의 전역 임계값으로 복구할 수 있습니다.
MI250X (gfx90a, ROCm 7.2.1)에서 Llama-3.2-3B-Instruct를 사용하여 측정하였으며, 지원되는 20개 모든 양자화 방식에 대해 llama-bench pp512, ubatch 1..8, 10회 반복 수행하였습니다. 전체 표는 PR 설명에 포함되어 있습니다.
선택된 pp512 처리량 (tok/s, ub=8):
Q4_K_S: 559 -> 940 (+68%)
Q5_K_S: 503 -> 884 (+76%)
Q3_K_S: 629 -> 879 (+40%)
Q2_K : 615 -> 809 (+32%)
Q6_K : 582 -> 776 (+33%)
선택된 pp512 처리량 (tok/s, ub=4):
Q4_K_S: 444 -> 480 (+ 8%)
Q4_0 : 682 -> 685 (+ 0%) (성능 저하 없음 - MMVQ 유지)
IQ4_XS: 706 -> 698 (- 1%) (성능 저하 없음 - MMVQ 유지)
-
CUDA: 리뷰 사항 반영 — 인라인 MMVQ 배치 테이블 적용, 환경 변수 해치(env hatch) 및 문서 블록 제거
-
CDNA1을 위한 커널 선택 로직 튜닝
공동 작성자: Johannes Gäßler johannesg@5d6.de
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) 비활성화
Android:
Windows:
Windows:
- Windows x64 (CPU)
- Windows arm64 (CPU)
- Windows x64 (CUDA 12) - CUDA 12.4 DLLs
- Windows x64 (CUDA 13) - CUDA 13.3 DLLs
- Windows x64 (Vulkan)
- Windows x64 (SYCL) DISABLED
- 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가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기