DeepSeek은 자체 프로덕션 서비스의 기반 엔진인 DeepInfer를 오픈소스로 공개했습니다. 저희는 이 DeepInfer를 단일 8×B300 노드에서 DeepSeek-V4.1-Flash-1017 모델로 vLLM과 직접 비교했으며, 출력 토큰과 프리필(prefill) 모두 극한까지 테스트했습니다.
요약: 하나의 노드에서 vLLM이 디코드(decode) 시 (1K → 1K) 2.0배 빠르고, (8K → 1K)에서는 4.3배 빠르며, 프리필에서는 9배 빠릅니다. 최대 성능은 658K 프리필 토큰/초와 55–65K 출력 토큰/초에 달합니다.
vLLM vs DeepInfer on 8×B300
엔진 비교
두 엔진 모두 주로 동일한 커널(FlashMLA, DeepGEMM, DeepEP)을 사용하고 동일한 방식으로 모델을 확장합니다: 어텐션은 GPU당 복제되고, 전문가(experts)는 GPU에 걸쳐 샤딩됩니다. 차이점은 범위입니다.
| vLLM | DeepInfer |
|---|
| 모델 | 수백 개 | DeepSeek-V4.1-Flash만 |
| ... | | |
설정 (Setup)
- GPU: NVIDIA B300 SXM6 8개, 각 275 GB HBM3e, NVLink 5
- 모델: DeepSeek-V4.1-Flash-1017, 476 GB (FP4 전문가, 나머지는 FP8, Engram 테이블 두 개)
- vLLM: 0.31.1rc1, B300 레시피, DEP8, 랭크당 256 시퀀스, 5개 드래프트 토큰을 사용한 DSpark
- DeepInfer: 커밋 8b16149, EP8 × DP8, 5개 드래프트 토큰을 사용한 DSpark, 오프라인 API
- 부하 (Load):
vllm bench serve, 무작위 토큰 프롬프트, 고정 출력 길이; DeepInfer는 동일한 프롬프트를 인프로세스(in-process)로 처리했습니다.
무작위 프롬프트는 추측 디코딩(speculative decoding)의 최악의 경우이므로 (1K에서 19% 드래프트 수용, 8K에서 12%), 여기에 제시된 모든 디코드 숫자는 최소치입니다.
DEP8이 모델을 배치하는 방식
이 모델은 MoE(Mixture-of-Experts) 구조이며, 레이어당 384개의 라우팅 전문가와 1개의 공유 전문가를 가지고 있고, 토큰당 6개를 사용합니다. vLLM의 레시피는 이를 DEP8로 실행하는데, 각 GPU가 자체 어텐션과 KV 캐시를 가지며 48개의 전문가를 보유하고; 모든 MoE 레이어마다 토큰들이 NVSwitch를 통해 해당 전문가들로 이동합니다.
DEP8 layout on 8×B300
메모리가 병목(bottleneck)이 아니다: 가중치(weights)는 GPU당 46 GiB를 차지하고 KV 캐시(KV cache)는 160 GiB가 확보되어 (랭크당 약 52M 토큰 분량의 여유 공간)
실제 제한은 랭크당 256개, 노드당 2,048개의 실행 시퀀스이다.
Memory of one B300
vLLM의 최대 부하(full load)에서의 성능
프리필(Prefill) (요청당 하나의 출력 토큰): 8K 프롬프트 사용 시 658K 토큰/초, GPU당 약 82K를 달성했다.
vLLM prefill
2,048개의 동시 요청을 이용한 디코드(Decode): 짧은 프롬프트 사용 시 65.0K 출력 토큰/초, 1K → 1K에서는 55.0K를 기록했다 (토큰당 29 ms).
vLLM decode
| In → Out | 동시 요청(Concurrent) | 출력 토큰/초 (Output tok/s) | 총 토큰/초 (Total tok/s) | TPOT |
|---|
| 128 → 1K | 2,048 | 64,990 | 73,114 | 24.8 ms |
| ... | | | | |
한 가지 문제점(gotcha): 첫 번째 실행에서는 CUDA 그래프가 최대 1,536 토큰까지만 캡처되었기 때문에 1K → 1K에서 단지 37.2K tok/s만 기록했다. 부하 조건에서는 단계들이 디코드와 프롬프트 청크를 혼합하여 처리하고 모든 DP 랭크가 가장 큰 값으로 패딩(pads)되므로, 해당 단계들은 그래프 없이 실행되었다. 최대 8,192 토큰까지 그래프를 캡처하자 55.0K로 향상되었다.
DeepInfer의 단일 노드 성능
벤치마킹하는 것보다 설치하는 데 시간이 더 오래 걸렸다: NVCC 13.1 이상으로 소스 빌드를 해야 하며, 단일 노드에서도 RDMA 장치가 필요하다 (Engram 행에 대한 NCCL GPU-initiated 네트워킹).
DeepInfer vs vLLM decode
DeepInfer vs vLLM prefill
| In → Out | Concurrent | DeepInfer | vLLM | vLLM ÷ DeepInfer |
|---|
| 1K → 1K | 2,048 | 27,906 | 54,985 | 2.0× |
| ... | | | | |
| DeepInfer의 자체 벤치마크는 (노드당 66K prefill 토큰/초)와 일치하므로, 이는 우리의 테스트 환경이 아닙니다. | | | | |
격차의 원인? DeepSeek은 4개의 GPU에서 prefill을 수행하고 64개의 GPU에서 decode를 수행하는 방식으로 DeepInfer를 벤치마크했습니다. 이들은 각각 하나의 NVLink 도메인에 속해 있습니다. 이는 서버가 아니라 랙(rack) 규모이며, prefill과 decode가 분리된 장비에서 이루어집니다. 이러한 배포를 하나로 유지하는 구성 요소들(KV cache 시스템, P/D disaggregation, 로드 밸런싱)은 오픈 소스 버전에는 포함되어 있지 않습니다. DeepInfer는 하나의 노드에서 모든 것을 동시에 처리해야 하며, 이는 vLLM의 설계 목적과 정확히 일치합니다. 따라서 이것을 커널 자체에 대한 심판으로 받아들이기보다는 '단일 노드에서의 DeepInfer 성능'으로 이해하는 것이 좋습니다.
어떤 엔진이 언제 필요한가
- 하나 또는 소수의 노드를 사용하는 사용자용 API: vLLM. decode는 2배, prefill은 9배 빠르며, 사용 가능한 OpenAI 호환 서버를 제공합니다.
- DeepSeek-V4.1-Flash 외의 모든 모델: vLLM.
- 재현 가능한 오프라인 생성 (RL rollouts, 평가(evals), 합성 데이터): 배치 불변성(batch invariance)과 결정론적 샘플링을 위해 DeepInfer를 시도해 볼 수 있지만, 먼저 사용하려는 형태에 대한 처리량 측정을 해보세요.
- 랙 규모 NVLink (GB200/GB300 NVL72): 둘 다 확인해 보세요. DeepSeek이 해당 규모에서 서비스를 제공하는 방식은 DeepInfer를 이용하지만, KV cache, 분리(disaggregation), 로드 밸런싱은 직접 구축해야 합니다.
- Huawei Ascend 950: DeepInfer.
노드 한두 개만 가진 대부분의 팀에게 정답은 vLLM입니다. DeepInfer는 DeepSeek이 자체 모델을 구동하는 방식을 참고할 만한 가치는 있지만, 단일 노드에서는 더 빠른 엔진은 아닙니다.
본 내용은 warmctl.io에 처음 게시되었으며, 전체 설정, 시작 시간 분석 및 원시 데이터가 포함되어 있습니다.