b11404: metal - 몇 줄 MMA mat-mul 및 추측 디코딩을 위한 배치 복사 기능 추가 (#29869)
요약
본 기사는 Metal 백엔드에서 few-row MMA mat-mul 및 speculative decoding을 위한 배치 복사 기능을 추가한 내용을 다룹니다. 이를 통해 기존의 mat-vec 커널보다 성능이 우수한 행 수부터 최적화가 가능해졌습니다. 또한, 여러 텐서 연산에 대한 융합(fusion)과 그래프 최적화 로직도 개선되었습니다.
핵심 포인트
- few-row MMA 및 speculative decoding을 위한 배치 복사 기능 추가
- Metal GPU에서 mat-vec 커널 대비 성능 향상 확인 (M3 Ultra 기준)
- MUL_MAT + ADD 연산에 대한 융합(fusion) 최적화 구현
- 그래프 재정렬 및 메모리 범위 관련 로직 개선 및 정리
-
metal: few-row MMA mat-mul 및 speculative decoding을 위한 batched copies
Speculative decoding은 단계별로 몇 개의 초안 토큰(draft tokens)을 검증합니다. tensor API가 없었을 때, Metal은 이 mat-muls를 mat-vec 커널로 실행했는데, 이 커널의 시간은 src1 행 수에 따라 증가하여 M3 Ultra에서 DFlash2 디코딩이 순차적 디코딩보다 느리게 작동했습니다. -
8x8 simdgroup 매트릭스에 대해 2..16개의 src1 행에 대한 mat-mul 커널 추가: 모든 가중치(weight)는 모든 행에 대해 한 번 양자화 해제(dequantized)되며, threadgroup의 simdgroups가 K를 분할합니다. Q4_0, Q8_0 및 Q5_K는 자체 커널을 가지며, F32, F16, Q4_1, Q5_0, Q5_1, Q4_K 및 Q6_K는 16개 가중치 양자화 해제기(dequantizers)에 대한 일반 경로를 사용하고, 2행의 Q4_0은 mat-vec 커널의 2행 변형을 사용합니다.
-
이 기능들은 tensor API 없이 MTLGPUFamilyApple7 이상에서만 사용 가능하며, M3 Ultra에서 mat-vec 커널보다 성능이 우수한 행 수(F32: 6, F16, Q4_K, Q5_0, Q5_1: 3, 기타 유형: 2)부터 적용됩니다.
-
fusion table: MUL_MAT + ADD는 MMA 스토어에 동일 모양의 잔차(residual)를 추가하고, 동일한 두 텐서 사이에서 최대 16개의 인접한 동일 레이아웃 f32 복사본이 하나의 디스패치로 실행됩니다.
-
fusion 검사와 ggml_graph_optimize는 장치 속성(device props)을 사용하므로, reorder packs는 모든 src1 행 수에 대해 결합할 수 있는 장치에서만 MUL_MAT + ADD를 재배열합니다.
-
views는 그룹을 재배열할 때 GGML_METAL_FUSION_MAX에 포함되지 않으므로, views로 연결된 16개의 순환 상태 스냅샷 복사본은 하나의 그룹으로 유지됩니다.
-
encoder는 결합된 그룹의 내부 노드에서 동시성(concurrency)을 확인하고, 범위별로 쓰여진 view를 추적하며, CPY의 목적지(destination)를 읽기로 계산하지 않습니다.
-
CONCAT은 적은 행이 있을 때 긴 행들을 threadgroups에 걸쳐 분할합니다.
-
테스트: test-backend-ops에서 few-row MUL_MAT, MUL_MAT_ADD, CPY_BATCH 및 CONCAT 케이스를 테스트하고 (복사 순서를 위한 prepare_graph 훅 포함), test-metal-graph-optimize, test-metal-cpy-batch-alias를 테스트합니다.
-
metal: CPY_BATCH fusion 제거 및 메모리 범위 변경
배치 복사 융합(batched copy fusion)과 해당 커널 및 테스트를 제거하고, 리뷰에서 제안된 대로 메모리 범위 변경 사항을 되돌립니다. 메모리 범위, 그래프 재정렬, 그리고 CPY 인코더는 다시 master 브랜치의 상태와 동일합니다.
-
cont: clean-up
-
cont: has_tensor 게이트 제거
-
cont: 피연산자/잔차 로직 정리
-
cont: Q4_0 ne11=2 특수 사례 제거
-
cont: kernels/mul_mv_mma.metal 추가
-
cont: mma 파이프라인 선택 로직 통합
-
cont: 장치 속성으로부터 융합 로직 분리
공동 작성자: Georgi Gerganov [email protected]
AI 자동 생성 콘텐츠
본 콘텐츠는 llama.cpp Releases의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기