NVLink 없이 6x3090 / 6x4090에서 Qwen3.8-Flash-Next 구동: prefill 속도 8~10배 향상, 장문맥 디코드
요약
본 기사는 NVLink 없이 일반 PCIe 연결만으로 다수의 GPU(3090/4090)를 활용하여 Qwen3.8-Flash-Next와 같은 대규모 언어 모델을 구동하는 최적화 방법을 제시합니다. 특히, 기존 llama.cpp의 문제점이었던 장문맥(250k 토큰) 디코딩 시 속도 저하 문제를 해결하고 prefill 및 decode 성능을 획기적으로 향상시킨 패치 내용을 공유합니다.
핵심 포인트
- NVLink 없이 PCIe만으로 다중 GPU 구동 가능
- 장문맥 디코딩 시 발생하는 속도 저하 문제 개선
- Prefill과 Decode 단계의 전반적인 성능 향상 확인
- llama.cpp에 적용된 최적화 패치 내용을 공유함
자세한 내용, 전체 표 및 원시 데이터: https://github.com/ggml-org/llama.cpp/discussions/30071 바이너리 및 docker 이미지가 포함된 저장소: https://github.com/lukolszewski/llama.cpp-multigpu
저는 일반 PCIe를 통해 6개의 3090으로 Qwen3.8-Flash-Next를 구동했습니다 (NVLink 없음, 일부 카드는 x4 및 x2 레인 사용). 각 세션은 262k 길이였습니다. 기존 llama.cpp는 컨텍스트가 깊어질수록 속도가 느려졌고 여러 세션을 동시에 디코딩할 때 문제가 발생하여 작동이 불안정했습니다: 5x250k에서 세션당 2.3 t/s였습니다. 그래서 저는 9월 동안 이 문제를 수정하는 데 시간을 보냈습니다. 패치는 upstream의 df03399b8 위에 올라가 있으며 tarball(V100부터 5090까지 CUDA 12.9, Ampere+에 대해 CUDA 13.4) 및 ghcr 이미지로 배포됩니다. GGUF도 동일하고, llama-server도 동일하며, 모든 것은 환경 변수(env vars)를 통해 전환됩니다. 모델은 동일합니다 (unsloth UD-Q4_K_XL), 명령어 라인도 동일하며, 5 슬롯 x 262k, q8_0 KV, 레이어 분할을 사용했습니다.
토큰/초 비교: upstream -> 패치 적용:
- 작업 부하 (ctx) 6x3090 (제 것)
- prefill, 1 세션 250k: 263 -> 2111 (8배)
- prefill, 1 세션 250k: 744 -> 7403 (10배)
- decode, 1 세션 250k: 10.2 -> 33.7 (3.3배)
- decode, 1 세션 250k: 21.0 -> 48.7 (2.3배)
- decode, 5 세션, 각 250k: 2.3 -> 27.3 (10.8배) 실행되지 않음 -> 30.8 decode
- 1 세션 5k: 38.5 -> 45.9
- 1 세션 62.2 -> 62.8
핵심은 형태입니다: 패치된 prefill은 5k부터 250k까지 평탄하며, decode 속도 저하가 거의 없습니다. 반면 upstream은 약 50k마다 절반으로 줄어듭니다. 사용자 한 명만 사용할 때 5k에서는 얻을 것이 없습니다. 10.8배는 2.3 t/s 기준이므로 언급하지 마십시오. llama.cpp-multigpu는 임시 성능 포크(upstream이 따라잡을 때까지)입니다. 장문맥 디코딩은 단일 GPU를 포함하여 모두에게 수정되었으며, 멀티-GPU 부분은 PCIe를 통한 레이어 분할용이며 켜지 않는 한 비활성화됩니다. 각 패치가 무엇을 하는지는 저장소에서 확인할 수 있습니다.
MTP: 시도해 봤지만, 이 장치에서는 대부분의 경우 더 느렸고, 기본 커밋 자체가 이 모델에 대한 upstream의 MTP보다 앞서기 때문에 포함되지 않았습니다.
N-gram 조회 추측 대신: 코드 재작성 및 리팩토링에서 2~2.5배, 코드 설명에서 1.5배 향상되며, 산문(prose)에서는 아무런 개선이 없습니다. 또한 활성 사용자 두 명을 넘어서면 스스로 기능을 끄기 때문에 다중 사용자 수치가 저하되지 않습니다. 위의 벤치마크는 이 기능이 꺼진 상태로 실행되었습니다.
주의사항: 하나의 모델로 테스트되었으며, CUDA만 사용했고, 느린 PCIe를 위해 작성되었습니다. 멀티 GPU 스위치를 켜면 NVLink 또는 단일 GPU 박스에서 문제가 발생할 수 있습니다. Prefill과 Decode가 혼합된 방식은 기존보다 좋지만 여전히 약점이며 개선이 필요합니다. 이 코드는 검토가 아닌 LLM을 사용하여 측정 및 출력 확인(니들 테스트, temp-0 출력 동일)을 통해 작성되었으므로, 제가 직접 상위 레벨 PR을 열지는 않을 것입니다. 각 변경 사항은 하나의 커밋이고 누구나 어떤 부분을 가져갈 수 있습니다. 수정: 대부분의 사람들이 핵심을 완전히 놓치고 있는 것 같아 여기서 답변합니다. 첫째, vLLM은 멀티 GPU에서 레이어(Layer) 및 파이프라인(Pipeline) 병렬 처리를 지원하지 않습니다. NVLINK가 없는 경우 속도가 훨씬, 훨씬 느립니다. 이는 텐서(Tensor) 병렬 처리로 실행하는 것이 의미가 없는 머신을 위한 것입니다. 만약 6대의 RTX3090으로 총 7k prefill 및 250k 컨텍스트에서 150t/s를 5개의 동시 세션에 걸쳐 실행하는 것이 느리다면(추측 디코드 없음), PCIe 링크 2개를 공유하는 4대가 포함된 경우, 이와 동일한 모델로 긴 컨텍스트의 수치를 보여주세요. 여기서 기다리겠습니다 :-) 제출자: /u/flynth92 [링크] [댓글]
AI 자동 생성 콘텐츠
본 콘텐츠는 Reddit AI Engineering의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기