教程范围与结论
本文部署对象是官方发布的 `deepseek-ai/DeepSeek-R1-Distill-Qwen-32B`,不是671B参数的完整DeepSeek-R1。官方模型卡将它列为基于Qwen2.5-32B蒸馏得到的稠密模型,并给出了vLLM和SGLang启动方式。
这篇教程采用Linux、NVIDIA GPU和vLLM的OpenAI兼容服务路线。命令依据官方资料整理,但不同GPU、驱动和vLLM版本仍需在自己的环境中验证。本站本地Docker测试环境没有下载数十GB模型,也没有完成真实双卡性能基准,因此本文不会虚构速度数据。
1. 部署前先判断硬件是否合适
32B稠密模型的BF16权重可以按“约32B参数 × 2字节”估算,单是权重就约64GB,实际运行还需要KV Cache、CUDA上下文和框架工作区。单张24GB消费级GPU无法直接承载官方BF16权重;双24GB同样不足以为完整BF16权重和运行缓存提供安全空间。
更稳妥的测试起点是两张48GB或更大显存GPU,使用张量并行分摊权重。若采用第三方INT4或INT8量化版本,显存需求可以降低,但量化文件的制作者、格式、质量变化和许可证必须单独核对,不能把第三方量化版本当成DeepSeek官方原始权重。
部署前记录以下信息:
- GPU型号、数量、单卡显存和卡间拓扑。
- NVIDIA驱动版本及 `nvidia-smi` 状态。
- 操作系统、Python、vLLM和PyTorch版本。
- 计划使用的上下文长度、并发数和最大输出长度。
- 模型缓存目录至少预留权重体积1.5倍以上空间。
2. 检查宿主机GPU
先确认两张GPU均可见,并查看拓扑:
nvidia-smi
nvidia-smi topo -m如果这里无法看到GPU,不要继续安装模型框架。应先解决驱动、硬件或虚拟化透传问题。两卡部署还要留意卡间连接;模型能启动不代表跨卡通信效率一定理想。
3. 建立独立Python环境
以下示例使用Python虚拟环境,避免污染系统Python:
python3 -m venv /opt/venvs/deepseek-r1
source /opt/venvs/deepseek-r1/bin/activate
python -m pip install --upgrade pip
python -m pip install vllm huggingface_hub安装完成后保存实际版本:
python --version
python -m pip show vllm torch不要在生产机器上无条件执行长期不固定版本的升级命令。首次验证成功后,应生成依赖锁定文件或固定容器镜像标签。
4. 下载模型并校验目录
可以让vLLM首次启动时自动下载,也可以提前下载到独立模型目录。国内或离线环境更适合提前下载,防止启动服务时因网络中断留下不完整文件。
export HF_HOME=/data/huggingface
huggingface-cli download deepseek-ai/DeepSeek-R1-Distill-Qwen-32B --local-dir /data/models/DeepSeek-R1-Distill-Qwen-32B下载完成后检查磁盘空间和主要配置文件:
du -sh /data/models/DeepSeek-R1-Distill-Qwen-32B
ls -lh /data/models/DeepSeek-R1-Distill-Qwen-32B | head离线搬运时应在联网端生成文件哈希并在目标机器复核。模型目录要放在持久化磁盘,不要只存在容器可写层中。
5. 使用vLLM双卡启动
DeepSeek官方模型卡给出的示例使用两卡张量并行、32768上下文和 `--enforce-eager`。在此基础上增加明确的模型服务名、监听地址和显存利用率:
```bash source /opt/venvs/deepseek-r1/bin/activate
CUDA_VISIBLE_DEVICES=0,1 vllm serve /data/models/DeepSeek-R1-Distill-Qwen-32B --served-model-name deepseek-r1-distill-qwen-32b --tensor-parallel-size 2 --max-model-len 32768 --gpu-memory-utilization 0.88 --enforce-eager --host 0.0.0.0 --port 8000 ```
第一次启动建议保留 `--enforce-eager`,以更保守的方式排除CUDA Graph相关变量。稳定后是否移除,应通过同一组请求重新比较显存、首Token延迟和吞吐量。
`--gpu-memory-utilization` 不应一开始就设得过高。0.88只是保守起点,不是所有硬件的最佳值。如果仍然OOM,应先降低上下文长度和显存利用率,而不是反复重启碰运气。
6. 先检查服务,再发送对话
确认模型列表:
curl http://127.0.0.1:8000/v1/models发送最小对话请求:
curl http://127.0.0.1:8000/v1/chat/completions -H "Content-Type: application/json" -d '{
"model": "deepseek-r1-distill-qwen-32b",
"messages": [
{"role": "user", "content": "请用三点解释什么是张量并行。"}
],
"temperature": 0.6,
"max_tokens": 512
}'DeepSeek官方对R1系列给出的使用建议包括:温度可在0.5至0.7范围内设置,推荐值为0.6;避免额外System Prompt,把指令写入User Prompt;评测时进行多次测试并取平均结果。这些建议属于模型行为配置,不等于服务器性能参数。
7. 用Python客户端验证流式输出
```python from openai import OpenAI
client = OpenAI(base_url="http://127.0.0.1:8000/v1", api_key="local-test") stream = client.chat.completions.create( model="deepseek-r1-distill-qwen-32b", messages=[{"role": "user", "content": "写出排查CUDA OOM的步骤。"}], temperature=0.6, max_tokens=1024, stream=True, )
for chunk in stream: text = chunk.choices[0].delta.content if text: print(text, end="", flush=True) ```
验收时不能只看是否返回文字,还应检查HTTP状态码、模型名称、结束原因、Token统计、流式结束以及中文标点是否正常。
8. 阶梯式性能测试
按以下顺序测试,每次只调整一个变量:
1. 1并发、短输入、短输出,确认基础链路。 2. 1并发、目标上下文长度,记录显存峰值。 3. 逐步增加到2、4、8并发,记录失败率和排队时间。 4. 混合短请求与长请求,观察长尾延迟。 5. 连续运行至少30分钟,检查显存是否持续增长。
建议记录首Token延迟、每Token输出时间、端到端耗时、输入输出Token数、GPU利用率、显存峰值、功耗和失败原因。没有固定输入输出长度的“每秒Token”不能直接用于跨环境比较。
9. 常见故障处理
启动时显存不足
先降低 `--max-model-len` 和 `--gpu-memory-utilization`,确认没有其他进程占用GPU。若权重本身无法装入,不要指望降低并发解决,应改用更大显存、多卡或经过验证的量化版本。
两张卡只使用了一张
检查 `CUDA_VISIBLE_DEVICES`、`--tensor-parallel-size 2` 和进程日志。再用 `nvidia-smi topo -m` 检查拓扑,并确认两张卡型号和可用显存符合预期。
请求返回模型不存在
客户端中的 `model` 必须与 `--served-model-name` 一致。模型目录名称与对外服务名是两回事。
首Token很慢
区分模型冷启动、首次Kernel初始化、输入过长和服务排队。先预热,再用固定输入重复测试;不要拿第一次请求直接作为稳定性能。
输出重复或不连贯
核对温度、最大输出长度和提示词。按照DeepSeek模型卡建议,将温度设置在0.5至0.7范围,并避免不必要的System Prompt,然后使用相同问题多次复测。
10. 生产化之前还缺什么
前面的命令只建立了推理服务。真正上线前还需要反向代理、TLS、认证、限流、请求大小限制、日志脱敏、进程守护、健康检查、指标监控和容量保护。API密钥不能写入前端代码,服务端口也不应直接暴露在公网。
至少准备以下运行资料:
- 模型来源、提交版本或文件哈希。
- 驱动、镜像、Python、PyTorch和vLLM版本。
- 完整启动参数和环境变量。
- 基准请求集及性能结果。
- OOM、服务退出和节点故障的处理流程。
- 可以恢复到上一版本的镜像和配置。
参考依据与适用边界
本文主要依据DeepSeek-R1官方模型卡、DeepSeek-R1官方仓库以及vLLM OpenAI兼容服务器文档二次整理。官方资料确认了蒸馏模型列表、两卡vLLM启动示例和R1系列使用建议;具体显存峰值与性能必须在目标设备上实测。
如果使用的是完整671B DeepSeek-R1、其他蒸馏尺寸、第三方GGUF或AWQ/GPTQ量化文件,本文的硬件预算和启动参数不能直接照搬。



