这篇适合谁
适合手上有多卡 NVIDIA 服务器、想自己托管 DeepSeek-V4-Flash,并给应用提供 OpenAI 兼容接口的读者。读完你能启动服务,用 OpenAI SDK 跑通普通对话、流式输出、思考模式和工具调用,并知道部署时最容易卡在哪一步。
DeepSeek-V4-Flash 和 vLLM 是什么
DeepSeek-V4-Flash 是 DeepSeek 的模型,权重在 Hugging Face 上以 deepseek-ai/DeepSeek-V4-Flash 发布[2]。vLLM 是一个推理引擎,加载模型后通过 HTTP 对外提供服务。本文的参考机器是单机四张 NVIDIA RTX PRO 6000 Blackwell Server Edition,每张 96GB 显存[1]。
先选路线,再规划磁盘
两条路线的硬件要求相同,区别在于软件环境怎么装。Docker 路线把 vLLM 和依赖都放在官方镜像里,源码路线则要自己编译 SM120 分支,所以前者省时间,后者在没有 Docker 的环境里才有选择余地[1]。
本地工作站或裸金属服务器,如果已经装好 Docker、NVIDIA 驱动和 NVIDIA Container Toolkit,走官方 Docker 镜像路线。不提供 Docker 运行时的云平台,改走 Python 源码编译路线[1]。
磁盘要先规划。模型权重约 149GB;Python 环境、源码和编译产物至少 100GB;下载缓存在 /dev/shm 里至少留 20GB。Python 环境和编译目录不要放在 30GB 的系统盘上[1]。
下载模型:二选一
Hugging Face CLI 和 ModelScope 任选一种,下载一次即可,不要重复下载。国内网络可以用 ModelScope[1][2]。
python -m pip install -U huggingface_hub
hf download deepseek-ai/DeepSeek-V4-Flash \
--local-dir /root/autodl-fs/models/DeepSeek-V4-Flashpython -m pip install -U modelscope
modelscope download \
--model deepseek-ai/DeepSeek-V4-Flash \
--local_dir /root/autodl-fs/models/DeepSeek-V4-Flash启动前检查 GPU 和模型
依次运行 nvidia-smi、nvcc --version 和 nvidia-smi topo -m。正常情况是看到 4 张 RTX PRO 6000 Blackwell,nvcc 显示 CUDA 13.0,模型目录有 46 个权重分片,并且没有 .incomplete 文件[1]。
nvidia-smi
nvcc --version
nvidia-smi topo -m方案一:用官方 Docker 镜像部署
Docker 路线固定使用 vLLM 官方 nightly 镜像 nightly-c71a583aa9f81400528e67e3d818f66b804e8340。不要换成稳定版 v0.25.1:它固定的是 FlashInfer 0.6.13,没有本配置需要的 0.6.14[1]。
export VLLM_IMAGE=vllm/vllm-openai:nightly-c71a583aa9f81400528e67e3d818f66b804e8340
docker pull "$VLLM_IMAGE"启动命令会把 0 到 3 号卡交给容器,发布 8000 端口,并以只读方式挂载模型。它用 --tensor-parallel-size 4 把模型切到四张卡,--max-model-len 131072 设定 128K 上下文。--kernel-config '{"moe_backend":"marlin"}' 的作用是阻止 SM120 选中只支持 SM100 的 DeepGEMM MegaMoE 后端[1]。
这条路线先用 Eager 模式验证基础服务,暂时不要开 MTP 或 DSpark 推测解码[1]。日志出现 Application startup complete 即表示服务就绪[1]。
方案二:编译 SM120 预览分支
源码路线先建 conda 环境,Python 版本为 3.12,再用清华 PyPI 镜像安装 uv[1]。
conda create -p "$VLLM_ENV" python=3.12 pip -y
conda activate "$VLLM_ENV"从 jasl/vllm 克隆固定分支 sm120-pr-41834-stable-preview-20260717,并确认 commit 是 f63bfd3d7b425b10e0b5e0e2c130fe113a85d009[1]。这是社区预览分支,不是 vLLM 正式稳定版。复现时保留固定的分支和 commit,不要改用不断变化的 main 分支[1]。
git -c http.version=HTTP/1.1 clone --depth 1 \
--branch sm120-pr-41834-stable-preview-20260717 \
https://github.com/jasl/vllm.git "$VLLM_SRC"服务器访问不了 GitHub 时,可以先在本地电脑克隆、打包,再上传到服务器解压[1]。
接着安装 requirements/build/cuda.txt 里的构建依赖,指定 --torch-backend=cu130[1]。
uv pip install --verbose --no-progress \
-r requirements/build/cuda.txt \
--torch-backend=cu130FlashInfer 必须是 0.6.14:flashinfer-cubin 约 436.7MiB,flashinfer-python 约 13.9MiB。两个 wheel 用 --no-deps 从本地文件安装。仓库里的 requirements/cuda.txt 带有一个额外的 FlashInfer 索引地址,做法是先把这一行过滤出去,再安装其余依赖[1]。首次运行 flashinfer show-config 显示 compiled: 0 属于正常的 JIT 初始状态[1]。
编译前设置架构变量。目标架构是 120a 和 12.0a,并关闭预编译 wheel[1]。
export CUDA_ARCH_LIST=120a
export TORCH_CUDA_ARCH_LIST=12.0a
export VLLM_TARGET_DEVICE=cuda
export VLLM_USE_PRECOMPILED=0编译约用 2 小时,时长取决于 CPU 核数。日志末尾出现 Built vllm 和 Installed vllm 即编译完成[1]。之后 vllm --version 应输出 20260717,四张卡的计算能力都应是 (12, 0),并且 scaled_fp4_quant 算子已注册[1]。
关键参数怎么理解
服务启动命令的参数很多,可以按用途分组来看。
--tensor-parallel-size 4:把模型的张量切到四张卡上并行计算,四张卡都参与推理[1]。--enable-expert-parallel:在 Docker 路线中打开专家并行,适合 MoE 结构的模型[1]。--kv-cache-dtype fp8:KV 缓存用 FP8 存储,降低长上下文占用的显存[1]。--block-size 256:设定 KV 缓存的块大小,两条路线都使用这个值[1]。--gpu-memory-utilization 0.85:让 vLLM 只占用约 85% 的显存,其余留给首次编译和运行时的波动[1]。--max-model-len 131072:单个请求的最大上下文长度,即 128K token[1]。--max-num-seqs 4和--max-num-batched-tokens 4096:分别限制同时处理的请求数,以及单次调度的 token 数,首次部署时压力更小[1]。--served-model-name deepseek-v4-flash:客户端调用时使用的模型名,代码里的model字段要和它一致[1]。
验证服务是否正常
启动后先看日志里是否出现 Application startup complete。然后查询模型列表,确认接口返回的模型名是 deepseek-v4-flash[1]。普通对话、流式输出、思考模式和工具调用依次测试,任何一步失败,先回到启动参数上排查,不要急着换参数。
启动服务和调用
先看接口是否已经起来。服务日志里出现就绪信息后,接口才会响应请求,所以不要在日志还在加载时就开始测试[1]。
第一次启动用 Eager 模式,命令里带 --enforce-eager、--disable-custom-all-reduce 和 --gpu-memory-utilization 0.85,模型名设为 deepseek-v4-flash[1]。加载完成后,每张卡约占用 84GB 显存[1]。--disable-custom-all-reduce 的作用是改用 NCCL 通信,避开当前 PCIe 多卡环境下自定义 AllReduce 的兼容问题[1]。
先用 curl -sS http://127.0.0.1:8000/v1/models 查询模型列表[1]。然后用 OpenAI SDK 指向本地地址:
from openai import OpenAI
client = OpenAI(base_url="http://127.0.0.1:8000/v1", api_key="EMPTY")开启思考模式,需要传 extra_body={"thinking": {"type": "enabled"}}。服务端的 --reasoning-parser deepseek_v4 会把思考内容和最终回答分开[1]。工具调用则在请求里传 tools 并设置 tool_choice="auto",服务端需要 --tool-call-parser deepseek_v4 和 --enable-auto-tool-choice[1]。
可选优化:先跑通 Eager 再说
Eager 配置通过测试后,再尝试优化参数。教程加入的是 --enable-prefix-caching、CUDA Graph 的编译配置和 MTP2 推测解码[1]。在一组测试中,服务生成了 444 个 draft token,其中 264 个被接受,接受率约 59.5%[1]。相同长前缀的第二次请求,首 token 时间从 18.686 秒降到 0.470 秒[1]。优化配置启动失败时,保留 Eager 服务即可,基础部署不受影响[1]。
常见问题和限制
两条路线都依赖固定版本。Docker 路线的镜像 tag,以及 Python 路线的分支和 commit,都写在前文里。换掉其中任何一个,FlashInfer 版本或 SM120 支持都可能和文中的验证结果不一致[1]。
源码路线最耗时的是编译和依赖安装。编译约用 2 小时,FlashInfer 的两个 wheel 分别约 436.7MiB 和 13.9MiB。服务器下载不了时,可以先在本地电脑下载,再上传到服务器[1]。
云平台没有 Docker 时只能走源码路线。先确认 CUDA 版本是 13.0,再决定要不要花这两个小时去编译,这一步比任何参数都更值得提前核对[1]。
这套参数是针对四张 RTX PRO 6000、CUDA 13.0 和固定 vLLM commit 的,换硬件要重新验证。--gpu-memory-utilization 0.85 是为首次编译留出余量。首次启动可能很慢,因此把引擎就绪超时设为 3600 秒,即 VLLM_ENGINE_READY_TIMEOUT_S=3600[1]。
模型本身的说明,可以查看 Hugging Face 上的模型页面[2]。
本文改编自 Datawhale 开源项目 self-llm 中的 DeepSeek-V4-Flash vLLM 部署教程[1],原文以 Apache-2.0 许可证发布。
来源
- 103-DeepSeek-V4-Flash vLLM 部署Datawhale self-llm (Apache-2.0)
- 2deepseek-ai/DeepSeek-V4-FlashHugging Face
引用本页: DeepSeek-V4-Flash 用 vLLM 部署. TellWorld, https://www.tellworld.net/zh/practice/practice-deepseek-v4-flash-vllm. 更新于 2026-11-14