업데이트: 단일 RTX 3090에서 Qwen 3.8 27B를 140 tok/s로 구동 (Megakernel: KL divergence
요약
본 글은 Qwen3.8-27B를 단일 RTX 3090에서 구동하기 위한 CUDA megakernel 엔진을 소개합니다. 이 커스텀 엔진은 기존 llama.cpp 대비 정확도 저하 없이 코드 작성 및 추론 모드 등 전반적인 속도를 1.4~1.9배 향상시켰습니다. 또한, 다양한 컨텍스트 길이와 양자화 모델에 대한 상세한 벤치마크 결과를 제공합니다.
핵심 포인트
- CUDA megakernel 엔진으로 Qwen3.8-27B 구동 속도 대폭 개선 (llama.cpp 대비 1.4~1.9배).
- 정확도 측면에서 llama.cpp와 비교했을 때 품질 저하가 측정되지 않았습니다.
- 코드 작성, 추론 모드 등 주요 작업에서 성능 향상이 명확하게 나타났습니다.
- 다양한 컨텍스트 길이(1K, 30K, 96K)에 대한 정확도 및 Perplexity 테스트를 완료했습니다.
이 글은 어제 올린 게시물(https://www.reddit.com/r/LocalLLaMA/comments/1x2erdj/qwen3827b_on_a_single_3090_140_toks_on_code_with/)의 후속 내용으로, CUDA megakernel에 대해 자세히 다루었습니다. 긍정적인 피드백과 PR(Pull Request)을 주신 모든 분들께 감사드립니다! 요약하자면, 이 megakernel은 Qwen3.8-27B용 CUDA 엔진이며, 단일 3090에서 llama.cpp보다 1.4~1.9배 더 빠르게 작동합니다. 가장 많이 질문하셨던 내용은 정확도, 기준선(baseline) 및 컨텍스트 크기였으므로, 여기에 수치를 정리했습니다.
코드 및 벤치마크: https://github.com/L-Forster/open-jet/tree/master/megakernel
첫째, llama.cpp와 비교하여 엔진의 정확도를 벤치마킹했습니다. 품질 저하가 측정되지 않았습니다:
| Decode accuracy vs llama.cpp | Context Positions | MK top token | MK KL | LC top token | LC KL |
|---|---|---|---|---|---|
| 1K | 13,299 | 99.08% | 0.0009 | 98.68% | 0.0019 |
| 30K | 1,999 | 99.65% | 0.0007 | 99.35% | 0.0009 |
| 96K | 1,999 | 99.60% | 0.0008 | 99.45% | 0.0014 |
MK = megakernel, LC = llama.cpp batched. Top token = 상위 토큰이 참조(reference)와 일치하는 빈도. KL = nats 단위의 평균 KL divergence.
Perplexity (1K 실행만): megakernel 2.4274, llama.cpp batched 2.4283, reference 2.4263.
Log-loss vs the reference: 1K에서 +0.0005 +/- 0.0004, 30K에서 +0.0018 +/- 0.001, 96K에서 +0.0012 +/- 0.001. 유의미한 차이가 없습니다.
30K와 96K 행은 각각 하나의 코드 시퀀스이며, 1K 행은 코드와 산문(prose)입니다. Speculative decoding은 정확합니다: greedy output은 주 모델의 greedy 선택이며, sampling은 draft 없이도 동일한 분포를 유지합니다.
속도 (동일한 3090에서 megakernel vs llama.cpp with MTP)
- 코드 작성: 140 vs 73 tok/s
- 추론 모드(Reasoning mode): 78 vs 51 tok/s
- 컨텍스트에 30K 토큰의 코드가 있을 때: 73 vs 52 tok/s
- 프롬프트 처리(prefill): ~1,600 vs ~1,100 tok/s
speculative decoding을 사용하지 않을 경우 둘은 거의 같습니다 (42.9 vs 40.4). 성능 향상은 한 번의 비용으로 약 4~5개의 draft 토큰을 확인하는 데서 옵니다. llama.cpp는 2개의 draft를 실행했고, megakernel은 4개를 실행했습니다.
첫 게시물 이후 두 개의 PR이 병합되었습니다: 이제 로더가 모든 텐서의 타입을 확인하며, 서버는 요청을 받기 전에 워밍업(warm up)됩니다.
Model 다운로드는 unsloth가 레포지토리에서 Q4_K_M을 제거한 후 수정되었습니다. 또한 lmstudio-community와 mradermacher로부터 Q4_K_M을 로드합니다. openjet 설정은 각 모델이 어떤 엔진을 사용할지 보여줍니다.
양자화 지원 (Quantisation support) 이 표는 양자화 지원에 대한 세부 정보를 담고 있으며, unsloth의 Q4_K_M이 네이티브 모델이며 제가 벤치마크한 내용입니다. lmstudio와 mradermacher는 반(semi)-호환적이며 완전히 벤치마크된 것은 아닙니다. 잠정적인 결과에 따르면 타입 변환 후에도 네이티브와 유사한 속도를 보입니다. 다른 양자화 방식은 llama.cpp로 폴백합니다.
Qwen3.8-27B 파일
- unsloth의 오리지널 Q4_K_M에서 실행 (openjet 설정이 다운로드하는 것)
- megakernel: lmstudio-community, mradermacher megakernel, 반(semi)-호환적
- 다른 양자화 방식 (unsloth UD-*, bartowski, GSQ-RCO 등): llama.cpp
제한 사항 (Limits)
- 단일 GPU.
- 24GB 이상을 가진 RTX 30/40/50 시리즈.
- MK는 3090에서만 조정되었습니다. 147K 컨텍스트는 3090에서 실행됩니다 (fp16 KV cache는 ~80K, q8 사용 시 더 높음). 아직 작업 수준의 패스율(task-level pass-rate) 벤치마크는 없습니다.
기여할 수 있는 부분 (Contributions that would help)
- 특정 하드웨어에 대한 조정: RTX 4090, 5090 및 기타 24GB 이상 카드. 현재 3090에서만 조정되었습니다.
- Qwen3.8-27B의 다른 양자화 방식 지원을 부탁드립니다. PR과 함께 다음 내용을 포함해 주세요: 사용한 GPU와 bench/bench.py 또는 bench/code_bench.py의 전후 수치들. 기여 방법은 레포지토리의 CONTRIBUTING.md를 참고하세요.
- Qwen3.8-27B에 사용하는 양자화 방식을 댓글로 남겨주시면 다음으로 어떤 지원을 추가할지 알 수 있습니다! (또한 Qwen 4가 출시되면 그것도 계획하고 있습니다.)
제출자: /u/Adorable_Weakness_39 [링크] [댓글]
AI 자동 생성 콘텐츠
본 콘텐츠는 r/LocalLLaMA의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기