12 GB GPU용 Qwen 모델 Rust 추론 엔진 개발, 그리고 원본 Strata보다 빠른 Qwen3.8-Flash-Next 구동
요약
작성자는 Qwen GGUF 모델을 위한 순수 Rust 기반 추론 엔진 'RustingStrata'를 개발했습니다. 이 엔진은 VRAM에 맞지 않는 MoE 구조의 Expert들을 CPU와 GPU가 협력하여 처리하는 독특한 방식을 구현했습니다. 그 결과, 12GB GPU 환경에서 원본 Strata 및 llama.cpp 대비 디코드/프리필 속도 면에서 성능 향상을 입증했습니다.
핵심 포인트
- RustingStrata는 Qwen GGUF 모델을 위한 순수 Rust 추론 엔진입니다.
- MoE 구조 처리 시, VRAM 초과 Expert를 CPU와 GPU가 협력하여 관리하는 것이 핵심 기술입니다.
- 12GB 환경에서 원본 Strata 대비 디코드 속도가 크게 향상되었습니다 (예: 약 36 tok/s).
- llama.cpp와의 비교에서는 Prefill 성능이 동률인 구간도 존재하며, 모델 구조에 따라 차이가 있습니다.
저는 이 작업을 오랫동안 진행해 왔습니다: RustingStrata. 이것은 순수 Rust로 작성된 Qwen GGUF 모델용 추론 엔진이며, ggml을 사용하지 않습니다. CUDA 커널은 NVRTC를 통해 시작 시 컴파일되며, 동일한 커널이 Vulkan에서도 실행됩니다. 현재 많은 Qwen 모델을 구동할 수 있습니다:
- Qwen3.5 / 3.6: 2B부터 35B-A3B까지
- Qwen3: 4B dense, 30B-A3B
- Qwen3.8-27B dense
- Qwen3-Next-80B-A3B
- Qwen3.8-Flash-Next Quant 지원은 IQ1_S부터 Q8_0까지 가능하며, BF16 및 F16도 지원합니다. 주요 트릭은 VRAM에 맞지 않는 MoE(Mixture of Experts) 모델을 처리하는 것입니다. 적재되지 않은 Expert들은 GPU가 작동하는 동시에 CPU에서 실행되며, 엔진은 구동되는 동안 자주 사용되는 Expert들을 지속적으로 GPU로 이동시킵니다.
제 설정은 3060 12 GB, 7600X 및 32 GB RAM입니다.
Qwen3.8-Flash-Next
이것이 가장 흥미로운 모델이었습니다. Flash-Next는 독특한 모델 구조를 가지고 있습니다: 레지듀얼(residual) 대신 레이어당 임베딩에 4개의 하이퍼 연결 스트림(hyper-connection streams)을 사용하고, 어텐션과 혼합된 DeltaNet 레이어를 가지며, 12 GB에 담기기 어려운 거대한 MoE 구조를 가지고 있습니다. 지금까지 이 모델만을 위해 구축된 엔진은 원본 Strata (niko1221/strata)뿐이었기 때문에, 저는 이를 기준으로 삼았습니다: 먼저 토큰 단위로 출력을 일치시키는 것을 목표로 했고, 그 다음 속도를 능가하는 것을 목표로 했습니다.
IQ2_XS GGUF, 943-토큰 프롬프트:
- 원본 Strata: 디코드(decode) 시 19
22 tok/s, 프리필(prefill, warm cache) 시 140146 tok/s - CUDA를 사용한 RustingStrata: 평균 약 36 tok/s 디코드, 평균 약 370 tok/s 프리필 (최대 약 610)
- Vulkan을 사용한 RustingStrata: 평균 약 30 tok/s 디코드, 평균 약 375 tok/s 프리필 (최대 약 490)
Greedy 출력은 제가 확인한 모든 위치(거의 동점인 경우 포함)에서 원본의 argmax와 일치했습니다. 솔직히 말씀드리자면 한 가지 주의할 점이 있습니다: 콜드 페이지 캐시(cold page cache)를 가진 첫 번째 프롬프트에서는 프리필 속도가 디스크 읽기 속도에 의해 제한되며, 이 부분에서는 제가 초기에 실행했을 때 원본 Strata가 더 빨랐습니다.
llama.cpp 비교:
Qwen3.6-35B-A3B Q2_K_XL은 11.7 GiB이므로 제 카드에는 맞지 않습니다. 이 모델을 사용했을 때, 짧은 프롬프트에서는 약 118 tok/s 디코드 속도를 얻었고, 4K 프롬프트 이후에는 113 tok/s를 얻었습니다.
llama.cpp는 제가 할 수 있는 한 최적화(-ncmoe 12, -ub 2048, flash attention)하여 사용했을 때, 각각 68 및 66을 기록했습니다.
Prefill은 기본적으로 동률입니다: 4K에서 2216 tok/s 대 llama.cpp의 약 2236 tok/s이므로, 이 부분에 대해서는 주장할 수 없습니다. 32K에서는 prefill이 1800이고 decode가 92입니다. MTP drafts를 사용하면 쉬운 프롬프트에서 decode가 최대 160 tok/s까지 올라가며, 일반 텍스트의 경우 약 +16% 증가를 예상할 수 있습니다.
Qwen3-Next-80B IQ1_S: 대부분의 전문가는 CPU에 머무르지만, 여전히 약 92 tok/s로 decode됩니다. llama.cpp의 최적화된 -ncmoe는 저에게 약 44를 제공합니다. 출력은 토큰의 98~99%에서 llama.cpp greedy와 일치합니다. llama.cpp가 배치 모드(batch)와 토큰별 모드(token-by-token) 사이에서 자체적으로 동의하는 비율은 98.3%에 불과하므로, 누락된 부분들은 거의 동률입니다.
AMD: 누군가가 RX 7900 XT와 RX 9070(Vulkan / RADV)에서 테스트하고 매우 상세한 보고서를 보내주었으며, 이를 통해 많은 AMD 문제가 해결되었습니다. 하이브리드 CPU+GPU는 두 카드 모두에서 262k 컨텍스트로 실행되며, Qwen3.6-35B-A3B는 7900 XT에서 약 209 tok/s로 decode되어 해당 환경의 llama.cpp Vulkan 및 ROCm보다 앞섭니다. 몇 가지 AMD 전용 문제는 여전히 남아있으므로, AMD를 "작동하지만 아직 다듬어지는 중"으로 간주하십시오.
또한 chat 기능, tool calling을 지원하는 OpenAI 호환 서버, 그리고 사용자의 장치에 맞게 자체 조정하는 calibrate 명령어를 가지고 있습니다. 다른 카드를 가지고 계시다면 "strata bench" 출력을 보고 싶습니다. Vulkan은 shaderFloat64와 subgroup size 32가 필요하므로, Intel Arc 및 구형 AMD는 작동하지 않습니다. Windows에서는 VS C++ Build Tools가 필요합니다. RustingStrata는 /u/Serious_Scarcity7818이 제출했습니다 [링크] [댓글]
AI 자동 생성 콘텐츠
본 콘텐츠는 Reddit AI Engineering의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기