[onnxruntime] ONNX Runtime WebGPU: AMD GPU를 위한 Subgroup Matrix MatMulNBits 최적화
PR 링크: microsoft/onnxruntime#32796 상태: Merged | 변경: +295 / -146
들어가며
최근 microsoft/onnxruntime 레포지토리에 흥미로운 WebGPU 최적화 PR이 병합되었습니다. 기존의 MatMulNBits 연산은 주로 wave32 설정에 의존하고 있었으나, 이는 AMD D3D12 어댑터의 잠재력을 충분히 활용하지 못하는 한계가 있었습니다. 본 PR은 AMD 환경에서 wave64를 활용하고, 워크로드의 M, N, K 차원에 따라 타일 크기와 K-blocking 전략을 동적으로 조정함으로써 성능을 극대화하는 것을 목표로 합니다.
코드 분석
1. subgroup_matrix_matmul_nbits.cc: 동적 타일링 및 Wave64 도입
가장 핵심적인 변화는 ApplySubgroupMatrixMatMulNBits 함수 내에서 AMD 어댑터에 대해 wave64를 선택하고, 워크로드 크기에 따라 타일링 전략을 분기하는 로직입니다.
// Before: 고정된 128x128 타일 사용
tile_m = 128;
tile_n = 128;
workgroup_size = 128;
// After: 워크로드에 따른 동적 타일링
if (config.subgroupSize == 64) {
if (M <= 64) {
tile_m = 64;
tile_n = N == 64 ? 64 : 128;
tile_size_k = 64;
} else {
const bool use_four_waves = M > 384 && row_tiles_128 % 2 == 0;
tile_m = use_four_waves ? 256 : 128;
tile_n = 64;
tile_size_k = M < 256 ? 32 : (use_four_waves || M <= 384 ? 128 : 64);
}
}
이 변경은 단순히 wave64로 전환하는 것을 넘어, M이 작을 때 불필요한 패딩을 방지하고, 큰 M에 대해서는 4개의 웨이브를 사용하여 연산 효율을 높입니다. 또한 tile_size_k를 가변적으로 설정하여 메모리 배리어(barrier)를 줄이는 최적화를 수행했습니다.
2. subgroup_matrix_matmul_nbits.h: 프로그램 캐시 키 확장
타일 크기가 동적으로 변함에 따라, 이를 프로그램 캐시 키에 포함시켜 올바른 셰이더가 생성되도록 수정되었습니다.
// After
SubgroupMatrixMatMulNBitsProgram(..., uint32_t tile_m, uint32_t tile_n, uint32_t tile_k, ...)
: Program{config.subgroupSize == 64 ? "SubgroupMatrixMatMulNBitsWave64" : "SubgroupMatrixMatMulNBits"},
tile_m_(tile_m), tile_n_(tile_n), tile_k_(tile_k) {}
왜 이게 좋은가
이번 최적화의 핵심은 '워크로드 인지형 타일링(Workload-aware Tiling)'입니다.
- 성능 향상: 512-token prefill 기준 약 11%의 성능 향상을 보였으며, 전반적인 prefill 작업에서 약 9%의 이득을 얻었습니다.
- 리소스 효율성:
N=64인 경우 단일 웨이브를 사용하도록 최적화하여 워크그룹 스토리지 사용량을 19,456바이트에서 9,728바이트로 절반으로 줄였습니다. - 일반적 교훈: GPU 커널 최적화 시 고정된 타일 사이즈를 고집하기보다, 하드웨어의 특성(Wave64 vs Wave32)과 입력 데이터의 형상(M, N, K)에 맞춰 런타임에 최적의 파라미터를 선택하는 것이 성능의 핵심임을 보여줍니다.
리뷰 과정에서 qjia7님은 N=64일 때 불필요한 패딩을 제거하는 로직을 제안했고, 이는 실제 메모리 대역폭 절감으로 이어졌습니다. 또한, 다양한 에지 케이스(K가 타일 사이즈로 나누어떨어지지 않는 경우 등)에 대한 테스트 케이스 보강을 통해 안정성을 확보했습니다.
결론
이번 PR은 WebGPU 환경에서 하드웨어 가속을 최대한 끌어내기 위한 세밀한 튜닝의 좋은 예시입니다. 특히 AMD 하드웨어의 특성을 고려한 wave64 전략은 향후 다른 연산 최적화에도 중요한 벤치마크가 될 것입니다.
참고 자료
⚠️ 알림: 이 분석은 AI가 실제 코드 diff를 기반으로 작성했습니다.
관련 포스트
- [onnxruntime] ONNX Runtime WebGPU: Intel Xe-3LPG를 위한 고성능 GEMM 최적화 분석
- [onnxruntime] ONNX Runtime WebGPU QMoE: 단일 토큰 라우팅 최적화로 성능 대폭 향상
- [onnxruntime] ONNX Runtime WebGPU: Windows D3D12를 활용한 모델 로딩 가속화
- [sglang] [AMD ROCm] GLM-5.x Prefill 성능을 66% 끌어올린 Top-K 커널 최적화 분석
- [onnxruntime] ONNX Runtime WebGPU: NHWC Depthwise Convolution 최적화 분석
PR Analysis 의 다른글
- 이전글 [flashinfer] FlashInfer, Muse-Spark-Open을 위한 융합 정규화 및 TP/EP MoE 최적화로 성능 극대화
- 현재글 : [onnxruntime] ONNX Runtime WebGPU: AMD GPU를 위한 Subgroup Matrix MatMulNBits 최적화
- 다음글 [flashinfer] FlashInfer, Blackwell GPU를 위한 최적화된 Dense Projection GEMM 도입
댓글