b11513: CUDA: top-k 알고리즘 선택 개선 (#28713)
요약
본 기사는 CUDA 환경에서 top-k 알고리즘의 선택 및 구현 개선 사항을 다룹니다. 대규모 행 개수에 대한 radix top-k 최적화와 모양에 따른 TOP_K 구현 경로(bitonic, radix select, DeviceTopK 등)를 세분화하여 성능을 향상시켰습니다. 이를 통해 특정 연산에서 처리 시간이 크게 단축되는 등의 결과를 얻었습니다.
핵심 포인트
- 대규모 행 처리를 위해 radix top-k 알고리즘이 개선되었습니다.
- 입력 데이터의 모양(행/열 개수)에 따라 최적의 TOP_K 구현 경로를 선택합니다.
- DeviceTopK 사용 가능으로 최대 두 개의 행까지 처리할 수 있게 되었습니다.
- 전반적인 성능 향상과 안정성을 위해 여러 테스트 케이스와 내부 로직이 수정되었습니다.
- CUDA: 대규모 행 개수에 대한 radix top-k
CUB의 per-row DeviceTopKKernel을 grid-over-rows radix select로 대체하며, GGML_CUDA_TOPK_RADIX_MIN_ROWS를 통해 제어됩니다. qwen4exp에서 34,816 토큰 처리 시 top-k 연산이 1,671,253 실행/5,761.8ms에서 2,329/941.8ms로 단축되었습니다.
- CUDA: 모양에 따라 TOP_K 구현 선택
nrows/ncols 특별 케이스를 #28547의 결정 경계로 대체했습니다 ( #29278에 구현됨): 짧은 행에는 bitonic을, 여러 개의 긴 행에는 radix select를, 단일 긴 행에는 DeviceTopK 또는 CUB argsort를 사용합니다. 임계값은 빌드 시점에 여전히 재정의가 가능합니다.
이 경계를 기반으로 두 가지 개선 사항이 추가되었습니다:
- 행이 패딩된 1024까지는 bitonic을 계속 사용하며, 행이 블록 하나의 웨이브에 들어갈 때(nrows <= SM 개수) radix select는 약 1두어 번의 실행이라는 고정 비용을 지불하고 이는 더 많은 행에서만 상각됩니다.
- DeviceTopK가 사용 가능해지면서 최대 두 개의 행까지 처리할 수 있습니다.
radix select는 이제 행을 청크 단위로 처리하여 스크래치 메모리가 제한되도록 유지하며, bitonic 경로는 청킹 방식을 유지합니다. HIP과 MUSA는 이전 임계값을 유지합니다.
test-backend-ops 주변에 bitonic/radix 교차점을 테스트하는 성능 케이스를 추가했습니다.
-
CUDA: top-k 주석을 덜 장황하게 수정
-
CUDA: supports_op에서 TOP_K 너비 제한 제거
-
CUDA: 사용 가능한 경우 단일 행(single-row) TOP_K에 DeviceTopK 사용
-
CUDA: TOP_K 비토리식 확인(bitonic check)에서 ncols 오버플로우 방지
-
CUDA: argsort와 top-k 간의 행 청크 분할 헬퍼 공유
-
CUDA: TOP_K radix blocks_per_row 계산을 int64_t로 수행
-
CUDA: GGML_CUDA_TOP_K_NROWS_THRESHOLD_DEVICETOPK를 GGML_CUDA_TOP_K_NROWS_THRESHOLD로 이름 변경
-
CUDA: bitonic 경로와 CUB TOP_K 경로 간의 정렬 헬퍼 공유
-
CUDA: TOP_K TODO, 임계값(threshold), 청크 분할 주석 업데이트
-
tests: 여러 행 청크에 걸쳐 발생하는 TOP_K 케이스 추가
-
CUDA: TOP_K radix 루프에서 int64_t col 사용 및 임계값 주석 수정
-
CUDA: TOP_K와 ARGSORT 지원을 ne[0] <= INT_MAX로 제한
AI 자동 생성 콘텐츠
본 콘텐츠는 llama.cpp Releases의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기