DeepSeek-V4.1-Flash는 7,630억 개의 파라미터를 가지고 있습니다. Q2_K로 양자화해도 여전히 264.5 GB가 필요하며, RTX PRO 6000 Blackwell 한 장은 96 GB의 VRAM을 가지고 있습니다. 저희는 이 모델을 해당 카드 하나와 서버 RAM에서 OpenAI와 호환되는 API로 제공하는 오픈 소스 엔진인 deepseek-one-gpu를 공개했습니다. 본 글은 이를 설정할 사람들을 위한 것으로, 속도를 결정하는 요소가 무엇이며 엔진을 탓하기 전에 무엇을 확인해야 하는지에 대해 다룹니다.
계획에 참고할 수 있는 수치들
모든 수치는 저장소의 측정 결과에서 가져온 것이며, RTX PRO 6000 Blackwell Server Edition 기준입니다:
- 사용자 1명: 초당 63.11 토큰
- 동시 사용자 4명: 총 127.58 토큰 (가장 느린 사용자는 31.87)
- 동시 사용자 8명: 총 152.53 토큰 (각 사용자당 약 19 토큰)
- 사용자가 4명일 때 도착하는 64K 토큰 프롬프트가 디코딩되는 동안: 가장 긴 일시 중단 시간은 4.048초
1. VRAM에 상주하는 전문가(experts)들
이 모델은 레이어당 384개의 전문가 중 6개에게 모든 토큰을 라우팅합니다. 이 엔진은 어텐션, 밀집 부분(dense parts), 그리고 가장 많이 사용되는 5,825개 전문가(69.5 GiB)를 GPU에 유지하고, 나머지 9,535개 전문가(113.9 GiB)는 핀드 RAM(pinned RAM)에 보관하며 CPU 스레드가 계산하는 동안 GPU가 작동합니다. 측정된 실행에서 10분의 9 전문가 선택이 GPU에 놓였으며, 이 '핫 세트(hot set)'는 트래픽을 따라 계속 이동합니다: 전문가들은 PCIe를 통해 교체됩니다.
이 배치는 시작 시 추측되는 것이 아닙니다. 계획 단계가 모델 헤더, 사용자의 VRAM, 그리고 사용자의 RAM을 읽어 서버가 시작되기 전에 '핫 세트'를 결정합니다. 이것이 바로 RAM 요구 사항이 실제인 이유입니다: 약 280 GB에 대비해야 합니다. 이 플래너는 나중에 스와핑으로 인해 죽게 만드는 대신 최소 레이아웃을 담을 수 없는 호스트를 거부합니다.
2. GPU의 NUMA 노드
이 부분 때문에 가장 많은 시간이 소요되었습니다. CPU가 담당하는 작업은 메모리 버스가 허용하는 한 빠르게 RAM에서 expert weights를 읽어오기 때문에, 스레드는 GPU를 소유한 소켓에서 실행되어야 합니다. nvidia-smi topo -m에서 "NUMA Affinity"를 확인하고 서버를 여기에 바인딩하세요. 이 과정은 사용자당 초당 토큰 수를 약 53개에서 63개로 증가시킨 것과 같은 빌드였습니다.
함정: 많은 컨테이너 내부에서는 numactl --preferred가 seccomp에 의해 거부되며, 이 오류는 놓치기 쉽습니다. run.sh는 메모리 선호 바인딩을 시도한 다음, CPU 전용 바인딩, 그리고 taskset을 사용하며 어떤 것을 얻었는지 알려줍니다.
3. 여러 사용자가 한 단계를 공유할 때의 수치 계산 (Numerics)
배칭(batching)을 통해 엔진은 동일한 단계에서 여러 요청을 디코드합니다. 기본적으로 CPU expert는 포크 자체의 수치 계산 방식(--cpu-numerics fork)을 사용하는데, 이는 빠른 경로입니다. 배칭된 답변들은 품질이 유지되지만, 단독으로 서비스되는 요청과는 비트 단위로 동일하지 않습니다. 만약 동일한 토큰이 필요하다면, 요청별로 "strata_reproducible": "required"를 요청하거나 --cpu-numerics gpu로 시작할 수 있는데, 이는 단일 사용자 속도의 25.7%를 소모합니다. 대부분의 사람들은 기본 설정을 원합니다.
시작하기
v0.1.0 릴리스에서 제공되는 사전 빌드 엔진(CUDA 13, sm_120)을 사용하는 경우:
git clone https://github.com/inferencekey/deepseek-one-gpu.git && cd deepseek-one-gpu
./run.sh --dry-run # 이 머신에서 실행할 모든 명령어를 출력합니다
./run.sh # 누락된 경우 모델을 다운로드하고, 계획을 세우고, 바인딩하며, :8090에서 서비스합니다
그런 다음 모든 OpenAI 클라이언트를 http://localhost:8090/v1로 지정하세요. README의 quickstart에는 직접 빌드하는 방법과 수동으로 수행해야 하는 모든 단계가 나와 있습니다.
품질과 비용, 명확하게
고정 시드(fixed-seed) 서브셋에 대해 엔진은 GSM8K 0.927, IFEval 0.800, HumanEval 0.890을 기록했으며, 이는 DeepSeek의 API에서 전체 모델이 기록한 0.960, 0.853, 0.982와 비교됩니다. 동일한 Q2_K 파일을 사용하는 stock llama.cpp 포크는 HumanEval에서 0.878을 기록했으므로, 격차는 오프로드(offload)가 아니라 2비트 양자화(quantization) 때문입니다.
토큰당 비용으로 볼 때, DeepSeek의 API는 임대하는 RTX PRO 6000보다 저렴하며, 저장소의 비용 비교 문서에서도 그렇게 말하고 있습니다. 직접 실행할 경우 데이터가 기기를 벗어나지 않고, 다른 사람이 공유하지 않는 용량이라는 장점이 있습니다.
만약 자체 워커에서 API 키를 통해 사용하고 싶다면, 해당 저장소는 또한 integrations/inferencekey에 InferenceKey 사용자 정의 백엔드를 제공합니다.
공을 돌리자면: 이 오프로드 방식과 서버는 llama.cpp 및 ggml 위에 Niko1221의 Strata(https://github.com/Niko1221/Strata)와 기여자들로부터 왔으며, vcruz305가 포크한 DeepSeek-V4.1 및 Q2_K GGUF, 그리고 DeepSeek의 오픈 웨이트를 활용했습니다. 위 모든 내용은 각 수치에 대한 출처와 함께 deepseek-one-gpu 저장소에 있습니다.