教程范围与结论

本文部署对象是官方发布的 `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量化文件,本文的硬件预算和启动参数不能直接照搬。

来源、翻译与版权说明

来源:DeepSeek 官方文档。第三方内容版权归原作者或发布机构所有;本站仅在许可证或明确授权允许时提供本地原文。

原文语言
ZH
原文更新时间
未提供
许可证
未登记