부분적으로 오프로드된 MoE 모델의 프롬프트 처리 속도를 획기적으로 개선하는 방법
Drastically improve prompt processing speed for --n-cpu-moe partially offloaded models
핵심 요약
llama.cpp에서 ubatch 크기를 늘려 VRAM을 최적화하면 프롬프트 처리 속도를 대폭 높일 수 있음.
- ubatch 최적화 — ubatch 값을 높여 프롬프트 처리 속도를 최대 8.7배까지 향상함.
- VRAM 트레이드오프 — 더 큰 배치 처리를 위해 일부 MoE 레이어를 CPU로 오프로드해야 함.
- 성능 영향 — 프롬프트 처리 속도는 비약적으로 상승하지만 토큰 생성 속도는 소폭 감소함.
- 설정 주의사항 — VRAM 한계에 도달하면 OOM이 발생하므로 시스템 사양에 맞춰 조정이 필요함.
RTX 3090에서 ubatch를 키우니 gpt-oss-120b 프롬프트 처리 속도가 훨씬 빨라짐
24GB RTX 3090에서 llama.cpp로 gpt-oss-120b-F16.gguf를 튜닝하다가, 물리적 마이크로 배치 크기(-ub)를 늘리면 --n-cpu-moe를 VRAM 내에 유지할 만큼 충분히 높이는 한 프롬프트 처리 처리량이 엄청나게 향상된다는 걸 발견함.
llama.cpp 기본값은 -b 2048이고 -ub 512임. 차트에 기본 설정 실행 결과도 포함했음.
내가 차트로 만든 비공식 llama-bench 결과는 다음과 같음:
|ubatch|n-cpu-moe|prefill|generation|
|:-|:-|:-|:-|
|256|25|240.03 tok/s|33.14 tok/s|
|512 (default)|26|380.27 tok/s|32.29 tok/s|
|2048|25|1112.54 tok/s|32.96 tok/s|
|4096|26|1682.47 tok/s|32.38 tok/s|
|8192|28|2090.68 tok/s|30.05 tok/s|
llama.cpp 기본값인 -ub 512와 비교했을 때, 프롬프트 처리는 약 380 tok/s에서 약 2091 tok/s로 약 5.5배 증가함. 더 작은 -ub 256 실행과 비교하면 약 8.7배 증가함. 토큰 생성은 기본 설정에서 약 32.3 tok/s였던 것이 -ub 8192에서 30.1 tok/s로 떨어져 약 7% 감소함.
문제는 더 큰 ubatch가 더 많은 GPU 연산 작업 공간을 필요로 한다는 점임. 내 머신에서는 -ub 4096은 --n-cpu-moe 26이 필요했고, -ub 8192는 --n-cpu-moe 28이 필요했음. 즉, 이건 처리량 트레이드오프임. 더 큰 배치를 위해 MoE 레이어 몇 개를 CPU로 옮기면 프롬프트 위주의 작업은 엄청나게 빨라지고 생성은 약간 느려짐.
참고: 처음 네 개의 prefill 포인트는 pp4096임. 8192 ubatch 포인트는 pp8192 실행에서 나온 거라 완벽하게 통제된 벤치마크라기보다는 비공식 튜닝 결과로 봐주길 바람.
내가 DGX Spark를 산 이유 중 하나가 더 나은 프롬프트 처리 속도를 원해서였음. 이 팁을 미리 알았더라면 그렇게 하지 않았을지도 모름. 물론 여전히 아주 좋은 머신이고, gpt-oss-120b에 대해 약간 더 나은 프롬프트 처리 성능과 두 배 정도의 토큰 생성 속도를 보여주긴 함. 하지만 더 높은 ubatch가 그 격차를 획기적으로 줄여줌.


