Strix Halo + RTX 3090 Ti에서 262K 컨텍스트로 Qwen3.8-27B 구동: 9.5에서 153 tok/s로 향상, HumanEval에서 듀얼 3090 vLLM 박스 능가
Qwen3.8-27B at 262K context on a Strix Halo + RTX 3090 Ti: 9.5 -> 153 tok/s, and it beats a dual-3090 vLLM box on HumanEval
핵심 요약
Strix Halo와 RTX 3090 Ti를 조합해 최적화 기법으로 27B 모델의 추론 속도를 16배 이상 끌어올린 사례입니다.
- 하드웨어 최적화 — Strix Halo와 RTX 3090 Ti를 결합해 모델 레이어를 효율적으로 분산 배치함
- 성능 향상 — KV 캐시 양자화와 llama.cpp 패치 등을 통해 32K 컨텍스트에서 153 tok/s 달성
- 코드 생성 능력 — HumanEval 벤치마크에서 듀얼 3090 vLLM 환경보다 더 빠르고 정확한 결과 도출
- 실패한 시도 — 외부 드래프트 모델이나 다중 경로 병렬 드래프팅은 오히려 성능 저하를 유발함
레이어 배치, KV 포맷, 그리고 llama.cpp 자체를 실험 변수로 두고 한참을 굴려봤다. 실험 159번 돌림. 숫자가 먼저고, 주의사항은 나중에 적는다.
하드웨어: AMD Ryzen AI MAX+ 395 (Strix Halo, 128 GB 통합 메모리) + eGPU로 연결된 RTX 3090 Ti. llama.cpp 프로세스 하나, AMD는 Vulkan, NVIDIA는 CUDA로 돌렸고 27B 모델 하나를 둘로 쪼개서 올림.
기준점(Baseline): 9.474 tok/s. 타겟 전용, 추론(speculation) 없음, AMD 단독 구동.
이제, 코드 형태의 생성 속도:
-
32K 컨텍스트: 153.32 tok/s
-
200K 컨텍스트: 87.74 tok/s
HumanEval, 164개 문제, 실제 코딩 에이전트(pi-agent) 구동, 공식 테스트 실행으로 채점:
-
로컬: 29.7분 만에 159/164
-
원격 2x RTX 3090 (vLLM TP2 구동): 42.4분 만에 157/164
장문 컨텍스트 검색 테스트: 15/15 성공, 로컬 352초 vs 원격 551초.
실제로 효과가 컸던 것들 (놀라운 순서대로):
-
채팅 템플릿. 더 간결한 템플릿(Qwen-Sharp)으로 바꿨더니 정확도 변화 없이 전체 시간 44%, 출력 토큰 51%가 줄어듦. GPU 최적화 몇 주 치보다 이게 더 큼. 그냥 모델이 쓸데없이 주절거리는 걸 막아줌.
-
배치 레버로서의 KV 캐시 포맷. K와 V 둘 다 q8_0에서 q4_0으로 내렸더니 정확히 2,176 MiB가 확보됨. 이게 262K 풀 컨텍스트에서 모든 풀 어텐션 레이어를 빠른 카드 쪽으로 옮기기에 충분한 용량이었음. 프리필(prefill) +28%, 생성 +20% 향상. Qwen3.8은 Gated DeltaNet과 풀 어텐션 비율이 3:1이라 64개 레이어 중 16개에만 KV가 있고, 컨텍스트에 따라 비용이 변하는 건 얘네뿐임. 어떤 레이어를 어느 GPU에 두느냐가 존나 중요함.
-
--spec-type draft-mtp,ngram-mod. 플래그는 누적됨. MTP 위에 n-gram을 얹으면 코드 생성 시 +72%에서 +140%까지 성능이 오르고, 산문에서는 -1% 정도인데 VRAM은 안 먹음. 코드 짤 거면 무조건 이득임. -
llama.cpp 한 줄 패치:
--spec-draft-ubatch. 추론 컨텍스트가 타겟의 512 마이크로 배치 설정을 그대로 상속받아서 4개 토큰 뽑으려고 2.2 GiB 컴퓨트 버퍼를 예약하고 있었음. 이걸 64로 낮추니까 1,039 MiB가 확보됐고, 1.78%의 프리필 비용으로 레이어 하나를 더 옮길 수 있게 됨. -
MTMD_BACKEND_DEVICE=Vulkan1을 써서 비전 인코더를 놀고 있는 iGPU로 보냄. 내가 알기론 문서화 안 된 내용임. 기본값은 첫 번째 GPU 장치로 보내는데, 이미 꽉 찬 3090 Ti에 884 MiB 할당하려다 뻗어버림.
안 먹혔던 것들 (너네는 시간 낭비하지 마라):


