vLLM 昇腾(Ascend)DeepSeek-V4 部署
本文档说明如何在昇腾(Ascend 910C / A3)服务器上,通过 vLLM Ascend 部署和服务 DeepSeek-V4-Flash(DSpark,w8a8 量化) 等大模型。文中主机名、IP、路径、容器名均为**示例**,请按实际环境替换。
1. 环境信息
| 项 | 值(示例) |
|---|
| 主机 | 昇腾 910C / A3 级服务器 |
| NPU | 16 × Ascend 910,64GB HBM/片(davinci0–15) |
| 驱动 | 25.5.0 |
| 本机 IP | 10.123.4.76(示例,替换为实际 IP) |
| API 地址 | http://<HOST_IP>:8000/v1(OpenAI 兼容) |
| 防火墙 | 放行服务端口 8000/tcp(firewalld) |
2. 镜像要求(关键)
- A3(910C)必须使用
-a3 后缀镜像,否则启动报设备类型不匹配 AssertionError 而失败。 - DSpark 需要 vLLM Ascend v0.25.0+(低版本如 0.22.x 不支持 DSpark)。
| 镜像 | 用途 |
|---|
quay.io/ascend/vllm-ascend:v0.22.x-a3 | 通用模型(如 Qwen 系列,vLLM 0.22.x) |
quay.io/ascend/vllm-ascend:DeepSeekV4-flash-<date>-a3 | DeepSeek-V4-Flash DSpark(vLLM 0.25.x) |
3. 部署
3.1 服务信息(示例)
| 项 | 值 |
|---|
| 模型 | DeepSeek-V4-Flash-<date>-w8a8(DSpark,w8a8 量化) |
| 模型路径 | /<data-dir>/<MODEL_DIR>/snapshots/master/ |
| 镜像 | quay.io/ascend/vllm-ascend:DeepSeekV4-flash-<date>-a3 |
| 并行 | 16 卡全用(DP4 × TP4 + 专家并行) |
| 端口 | 8000,模型名 deepseek-v4-flash |
3.2 启动服务(部署模板)
#!/bin/bash
# DeepSeek-V4-Flash-0731-w8a8 A3 单节点部署脚本(v0.23.0-a3 版本)
# 基于用户指定参数组合
# ============================================================
set -e
IMAGE=quay.io/ascend/vllm-ascend:nightly-releases-v0.25.1rc-a3
MODEL_DIR=/data2/Eco-Tech--DeepSeek-V4-Flash-0731-w8a8
PORT=8000
CONTAINER=ds-v4-flash-0731-w8a8
# 幂等启动:若同名旧容器已存在则先移除,保证脚本可重复执行
docker rm -f ${CONTAINER} >/dev/null 2>&1 || true
docker run -d \
--name ${CONTAINER} \
--network host \
--shm-size=512g \
--device /dev/davinci0 \
--device /dev/davinci1 \
--device /dev/davinci2 \
--device /dev/davinci3 \
--device /dev/davinci4 \
--device /dev/davinci5 \
--device /dev/davinci6 \
--device /dev/davinci7 \
--device /dev/davinci8 \
--device /dev/davinci9 \
--device /dev/davinci10 \
--device /dev/davinci11 \
--device /dev/davinci12 \
--device /dev/davinci13 \
--device /dev/davinci14 \
--device /dev/davinci15 \
--device /dev/davinci_manager \
--device /dev/devmm_svm \
--device /dev/hisi_hdc \
-v /usr/local/dcmi:/usr/local/dcmi \
-v /usr/local/Ascend/driver:/usr/local/Ascend/driver \
-v /usr/local/Ascend/driver/tools/hccn_tool:/usr/local/Ascend/driver/tools/hccn_tool \
-v /usr/local/bin/npu-smi:/usr/local/bin/npu-smi \
-v /usr/local/Ascend/driver/lib64/:/usr/local/Ascend/driver/lib64/ \
-v /usr/local/Ascend/driver/version.info:/usr/local/Ascend/driver/version.info \
-v /etc/ascend_install.info:/etc/ascend_install.info \
-v /etc/hccn.conf:/etc/hccn.conf \
-v ${MODEL_DIR}:/model \
-e OMP_PROC_BIND=false \
-e OMP_NUM_THREADS=10 \
-e PYTORCH_NPU_ALLOC_CONF=expandable_segments:True \
-e LD_PRELOAD=/usr/lib/aarch64-linux-gnu/libjemalloc.so.2 \
-e HCCL_BUFFSIZE=1024 \
-e TASK_QUEUE_ENABLE=1 \
-e HCCL_OP_EXPANSION_MODE=AIV \
${IMAGE} vllm serve /model/snapshots/master \
--max-model-len 1048576 \
--max-num-batched-tokens 10240 \
--served-model-name deepseek-v4-flash \
--gpu-memory-utilization 0.9 \
--max-num-seqs 64 \
--data-parallel-size 4 \
--tensor-parallel-size 4 \
--enable-expert-parallel \
--tokenizer-mode deepseek_v4 \
--tool-call-parser deepseek_v4 \
--enable-auto-tool-choice \
--reasoning-parser deepseek_v4 \
--enable-prefix-caching \
--model-loader-extra-config='{"enable_multithread_load": true, "num_threads": 128}' \
--quantization ascend \
--port ${PORT} \
--block-size 128 \
--speculative-config '{"method":"dspark","num_speculative_tokens":7,"enforce_eager":true}' \
--compilation-config '{"cudagraph_mode": "FULL_DECODE_ONLY"}' \
--async-scheduling \
--additional-config '{"ascend_compilation_config":{"enable_npugraph_ex":true,"enable_static_kernel":false},"enable_cpu_binding":true,"enable_dsa_cp":true,"enable_flashcomm1":true,"multistream_overlap_shared_expert":true}'
3.3 关键环境变量 / 参数优化(已验证)
| 项 | 说明 |
|---|
HCCL_BUFFSIZE=1024 | DSpark 专家并行必须,否则报 HCCL_BUFFSIZE_EP too SMALL |
VLLM_ASCEND_ENABLE_FUSED_MC2=1 | mega_moe 融合通信(W8A8 MoE 优化) |
VLLM_ASCEND_ENABLE_FLASHCOMM1=1 | FlashComm1 通信优化 |
OMP_PROC_BIND=false / OMP_NUM_THREADS=10 | 关闭 CPU 绑核 / 设置线程数 |
PYTORCH_NPU_ALLOC_CONF=expandable_segments:True | NPU 显存可扩展段,缓解碎片 |
LD_PRELOAD=.../libjemalloc.so.2 | 内存分配优化(需镜像内存在) |
--no-disable-hybrid-kv-cache-manager | 混合 KV 缓存管理器(DeepSeek-V4 必须,否则启动可能 OOM) |
--async-scheduling | 异步调度,提升并发吞吐 |
--enable-prefix-caching | 前缀缓存(与混合注意力配合) |
--gpu-memory-utilization 0.85~0.9 | 给 KV Cache 留余量,防 HBM 满载重计算 |
--enable-expert-parallel | MoE 专家并行(如 256 专家 / 16 rank) |
--speculative-config dspark:7 | DSpark 投机解码(7 tokens,配合 enforce_eager) |
--compilation-config FULL_DECODE_ONLY | Decode 阶段 ACL 图执行 |
--quantization ascend | W8A8 量化加载 |
说明:计算卡 davinci<N> 按实际数量逐一挂载(16 卡为 davinci0–15);--tokenizer-mode deepseek_v4、--tool-call-parser deepseek_v4、--enable-auto-tool-choice、--reasoning-parser deepseek_v4 为 DeepSeek-V4 专用参数,按模型需要加回。
4. 调用 API
4.1 cURL
curl http://<HOST_IP>:8000/v1/models
curl http://<HOST_IP>:8000/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{"model": "deepseek-v4-flash",
"messages": [{"role": "user", "content": "Who are you?"}],
"max_tokens": 256, "temperature": 0}'
4.2 OpenAI SDK(Python)
from openai import OpenAI
client = OpenAI(base_url="http://<HOST_IP>:8000/v1", api_key="EMPTY")
resp = client.chat.completions.create(
model="deepseek-v4-flash", # 与 --served-model-name 一致
messages=[{"role": "user", "content": "你好"}],
)
print(resp.choices[0].message.content)
5. 运维命令
docker ps --filter name=<CONTAINER> # 查看容器
docker logs -f <CONTAINER> # 查看实时日志
docker rm -f <CONTAINER> # 停止并删除容器
bash /path/to/run_<model>.sh # (重新)启动
注意:多模型共用同一端口时**不能同时运行**,切换前先停止当前容器;不同模型可分别指定端口同时运行。
6. 排障要点(踩坑记录)
- 镜像 A3 匹配:A3(910C)必须用
-a3 后缀镜像,否则启动报 AssertionError 设备类型不匹配。 - DSpark 必须
HCCL_BUFFSIZE=1024:否则 MoE 专家并行报 HCCL_BUFFSIZE_EP too SMALL ... NEEDED 557MB,引擎初始化失败。 - 不要设
HCCL_IF_BASE_PORT=65536:65536 是无效端口,会导致 TCPStore recvValueWithTimeout 超时、worker 崩溃;不设该变量让 vLLM 自动管理即可。 - DSpark 需要 v0.25.0+ 镜像:低版本(如 0.22.x)不支持 DSpark。
- 确保
vllm serve 各参数书写正确,多余的换行/续行被 vLLM 误吞会导致参数失效。 - 该版本不识别
--disable-log-requests,如报未知参数可去除。 - 多卡部署前需确认 NPU 全部空闲(triton 等容器占用会冲突)。
- 如需限制访问来源,可仅对指定 IP 开放防火墙端口。