DeepSeek-V4-Flash W8A8 MTP 昇腾 NPU vLLM 部署教程
1. 部署说明
本文档用于在昇腾 NPU 环境下,通过 Docker Compose 部署:
DeepSeek-V4-Flash-w8a8-mtp
推理框架:
vLLM Ascend
Docker 镜像:
quay.io/ascend/vllm-ascend:v0.22.1rc1
部署方式:
Tensor Parallel = 8
Data Parallel = 1
Expert Parallel = Enabled
MTP = Enabled
Quantization = Ascend W8A8
模型对外名称:
deepseek-v4-flash
API 服务端口:
8077
DeepSeek-V4-Flash 当前 vLLM-Ascend 支持 W8A8、自动 Prefix Cache、MTP 推测解码、Async Scheduling、Tensor Parallel 和 Expert Parallel 等能力,支持矩阵标注最大上下文长度可达到 1M。
2. 目录规划
建议宿主机目录:
/models/
└── DeepSeek-V4-Flash-w8a8-mtp/
├── config.json
├── tokenizer_config.json
├── ...
└── *.safetensors
Docker 容器中挂载为:
/workspace/DeepSeek-V4-Flash-w8a8-mtp
即:
volumes:
- /models:/workspace
检查模型:
ls -lh /models/DeepSeek-V4-Flash-w8a8-mtp
3. 检查 NPU
宿主机执行:
npu-smi info
确认可以正常看到 8 张 NPU:
davinci0
davinci1
davinci2
davinci3
davinci4
davinci5
davinci6
davinci7
同时确认驱动目录存在:
ls /usr/local/Ascend/driver
4. 检查 jemalloc
该优化配置使用:
LD_PRELOAD=/usr/lib64/libjemalloc.so.2
建议先确认当前 vLLM-Ascend 镜像中的实际路径:
docker run --rm \
quay.io/ascend/vllm-ascend:v0.22.1rc1 \
bash -c 'find /usr -name "libjemalloc.so*" 2>/dev/null'
如果输出:
/usr/lib64/libjemalloc.so.2
则使用本文配置即可。
如果实际是:
/usr/lib/aarch64-linux-gnu/libjemalloc.so.2
则需要将 Docker Compose 中:
LD_PRELOAD: "/usr/lib64/libjemalloc.so.2"
修改成:
LD_PRELOAD: "/usr/lib/aarch64-linux-gnu/libjemalloc.so.2"
vLLM-Ascend 官方 DeepSeek-V4-Flash 示例同样使用 jemalloc,只是不同基础镜像中动态库路径可能不同。
5. Docker Compose 配置
创建:
mkdir -p /data/deepseek-v4-flash
cd /data/deepseek-v4-flash
创建:
docker-compose.yaml
内容如下:
services:
deepseek-v4-flash:
image: quay.io/ascend/vllm-ascend:v0.22.1rc1
container_name: deepseek-v4-flash
restart: always
network_mode: host
shm_size: "1g"
stdin_open: true
tty: true
devices:
- /dev/davinci0:/dev/davinci0
- /dev/davinci1:/dev/davinci1
- /dev/davinci2:/dev/davinci2
- /dev/davinci3:/dev/davinci3
- /dev/davinci4:/dev/davinci4
- /dev/davinci5:/dev/davinci5
- /dev/davinci6:/dev/davinci6
- /dev/davinci7:/dev/davinci7
- /dev/davinci_manager:/dev/davinci_manager
- /dev/devmm_svm:/dev/devmm_svm
- /dev/hisi_hdc:/dev/hisi_hdc
environment:
# ============================================================
# CPU
# ============================================================
OMP_PROC_BIND: "false"
OMP_NUM_THREADS: "10"
# ============================================================
# NPU Memory
# ============================================================
PYTORCH_NPU_ALLOC_CONF: "expandable_segments:True"
# ============================================================
# Memory Allocator
# ============================================================
LD_PRELOAD: "/usr/lib64/libjemalloc.so.2"
# ============================================================
# HCCL
# ============================================================
HCCL_BUFFSIZE: "1024"
HCCL_OP_EXPANSION_MODE: "AIV"
# ============================================================
# Ascend Runtime
# ============================================================
TASK_QUEUE_ENABLE: "1"
ASCEND_MAX_OP_CACHE_SIZE: "-1"
# ============================================================
# DeepSeek / MoE Optimization
# ============================================================
VLLM_ASCEND_ENABLE_MLAPO: "1"
VLLM_ASCEND_BALANCE_SCHEDULING: "1"
# ============================================================
# Compile
# ============================================================
TE_PARALLEL_COMPILER: "32"
# ============================================================
# Reproducibility / Runtime
# ============================================================
PYTHONHASHSEED: "0"
volumes:
# 模型
- /models:/workspace
# Ascend Driver
- /usr/local/Ascend/driver:/usr/local/Ascend/driver
# DCMI
- /usr/local/dcmi:/usr/local/dcmi
# npu-smi
- /usr/local/bin/npu-smi:/usr/local/bin/npu-smi
# Cache
- /root/.cache:/root/.cache
command:
- vllm
- serve
- /workspace/DeepSeek-V4-Flash-w8a8-mtp
# ============================================================
# Model / Scheduler
# ============================================================
- --max-model-len
- "1048576"
- --max-num-batched-tokens
- "8192"
- --served-model-name
- deepseek-v4-flash
- --gpu-memory-utilization
- "0.95"
- --max-num-seqs
- "16"
# ============================================================
# Parallel
# ============================================================
- --data-parallel-size
- "1"
- --tensor-parallel-size
- "8"
- --enable-expert-parallel
# ============================================================
# DeepSeek V4
# ============================================================
- --tokenizer-mode
- deepseek_v4
- --tool-call-parser
- deepseek_v4
- --enable-auto-tool-choice
- --reasoning-parser
- deepseek_v4
# ============================================================
# Model Loading
# ============================================================
- --safetensors-load-strategy
- prefetch
- --model-loader-extra-config
- '{"enable_multithread_load":true,"num_threads":128}'
# ============================================================
# Quantization
# ============================================================
- --quantization
- ascend
# ============================================================
# Prefix Cache
# ============================================================
- --enable-prefix-caching
# ============================================================
# Network
# ============================================================
- --port
- "8077"
# ============================================================
# KV Cache
# ============================================================
- --block-size
- "128"
# ============================================================
# MTP Speculative Decoding
# ============================================================
- --speculative-config
- '{"num_speculative_tokens":1,"method":"mtp","enforce_eager":true}'
# ============================================================
# ACL Graph / Compilation
# ============================================================
- --compilation-config
- '{"cudagraph_mode":"FULL_DECODE_ONLY","cudagraph_capture_sizes":[1,2,4,8,16,24,32,40,48,56,64,128,256,512,1024,2048,4096,8192]}'
# ============================================================
# Async Scheduler
# ============================================================
- --async-scheduling
# ============================================================
# Ascend Optimization
# ============================================================
- --additional-config
- '{"ascend_compilation_config":{"enable_npugraph_ex":true,"enable_static_kernel":true},"enable_cpu_binding":true,"enable_dsa_cp":false,"multistream_overlap_shared_expert":true}'
这里故意采用 Compose 的 YAML List 形式传递启动参数,而不是:
command: >
这样可以保证每个参数独立成为一个 argv,避免多行 JSON、反斜杠或 YAML 换行被错误解析成 vLLM 参数。
6. 主要优化参数说明
6.1 MLAPO
配置:
VLLM_ASCEND_ENABLE_MLAPO: "1"
MLAPO 是 DeepSeek W8A8 场景下的 Ascend 性能优化能力。
官方说明 MLAPO 可以提升 DeepSeek W8A8 模型性能,但是会额外消耗 NPU 显存。
如果后续出现 NPU OOM,可以测试:
VLLM_ASCEND_ENABLE_MLAPO: "0"
判断显存占用是否明显下降。
6.2 1M Context
社区配置:
--max-model-len 1048576
等价于:
1024 × 1024 = 1,048,576 tokens
DeepSeek-V4-Flash 当前 vLLM-Ascend 支持矩阵标注最大:
1M
上下文。
不过:
支持 1M
和:
所有业务都应该配置 1M
是两回事。
--max-model-len 会影响 KV Cache 和调度资源规划。
如果实际业务不需要百万 Token 上下文,可以根据业务调整,例如:
- --max-model-len
- "40000"
或:
- --max-model-len
- "65536"
或者:
- --max-model-len
- "131072"
通常更容易取得:
吞吐
并发
显存
TTFT
之间的平衡。
6.3 Max Num Seqs
当前:
--max-num-seqs 16
表示当前 DP Group 最大同时调度:
16 个 sequence
官方说明超过 max-num-seqs × data-parallel-size 的请求将进入 Waiting 状态。
当前:
DP = 1
max-num-seqs = 16
因此最多同时调度约:
16 requests
其余请求排队。
6.4 Max Num Batched Tokens
当前:
--max-num-batched-tokens 8192
控制一次 Scheduler Step 最大处理 Token 数。
较大值:
Prefill 吞吐更高
但同时:
Activation Memory 消耗增加
官方 DeepSeek-V4-Flash 示例同样大量使用:
8192
作为起始配置。
7. Prefix Cache
当前开启:
--enable-prefix-caching
适用于大量请求拥有相同 System Prompt、长固定提示词或公共上下文的场景。
例如:
请求 A:
[30K system prompt] + Question A
请求 B:
[30K system prompt] + Question B
第二个请求可以复用前面的 KV Cache,从而减少重复 Prefill。
DeepSeek-V4-Flash 当前支持 Automatic Prefix Cache。
如果业务请求之间基本没有公共 Prefix,则收益会小很多。
8. Safetensors Prefetch
配置:
--safetensors-load-strategy prefetch
prefetch 会先把 checkpoint 文件读取进操作系统 Page Cache,然后再由 Worker 加载模型,可以提高模型启动阶段的权重读取效率。
对于:
大模型
多卡
NVMe
高内存服务器
通常比较合适。
但会增加模型加载阶段的:
Host RAM
Page Cache
磁盘读取
压力。
9. MTP 推测解码
配置:
{
"num_speculative_tokens": 1,
"method": "mtp",
"enforce_eager": true
}
对应:
--speculative-config
启用 DeepSeek-V4-Flash MTP speculative decoding。
当前配置每轮预测:
1 个 speculative token
用于提高 Decode 阶段生成速度。
DeepSeek-V4-Flash 官方支持 Speculative Decoding。
10. Async Scheduling
启用:
--async-scheduling
通过异步调度降低:
CPU Scheduling
NPU Execution
之间的同步等待。
DeepSeek-V4-Flash 当前 Ascend 支持矩阵明确支持 Async Scheduling。
对于高并发在线推理场景建议保留。
11. ACL Graph 配置
当前:
{
"cudagraph_mode": "FULL_DECODE_ONLY",
"cudagraph_capture_sizes": [
1,
2,
4,
8,
16,
24,
32,
40,
48,
56,
64,
128,
256,
512,
1024,
2048,
4096,
8192
]
}
虽然 vLLM 参数名字仍然叫:
cudagraph_mode
但在 vLLM-Ascend 场景实际用于 Ascend Graph/ACL Graph 执行策略。
当前:
FULL_DECODE_ONLY
主要针对 Decode 阶段进行 Graph 优化。
社区配置进一步显式指定:
cudagraph_capture_sizes
用于提前覆盖不同 Batch Size。
12. Static Kernel
当前:
"enable_static_kernel": true
与之前常见配置:
"enable_static_kernel": false
不同。
社区优化配置启用了 Static Kernel,目的是减少运行时动态 Kernel 相关开销。
如果后续遇到:
compile error
ACL graph error
unsupported kernel
shape related error
可以优先回退为:
"enable_static_kernel": false
进行问题定位。
13. DSA CP
当前:
"enable_dsa_cp": false
因此本文没有配置:
VLLM_ASCEND_ENABLE_FLASHCOMM1=1
这两个配置应保持一致。
即当前采用:
enable_dsa_cp = false
FLASHCOMM1 = disabled
不建议在没有对应性能测试的情况下,仅打开其中一项。
14. Shared Expert Multistream
开启:
"multistream_overlap_shared_expert": true
主要用于 MoE 模型 Shared Expert 的多 Stream overlap,使部分计算与通信过程重叠,从而提高 MoE Decode/Pefill 的执行效率。
15. 启动服务
首先检查 Compose:
docker compose config
如果没有 YAML 错误:
docker compose up -d
查看容器:
docker ps
应该能够看到:
deepseek-v4-flash
16. 查看启动日志
执行:
docker logs -f deepseek-v4-flash
也可以:
docker compose logs -f deepseek-v4-flash
重点观察:
模型权重加载
Tensor Parallel 初始化
Expert Parallel 初始化
HCCL 初始化
ACL Graph Capture
MTP 初始化
KV Cache
HTTP Server
17. 检查实际启动参数
执行:
docker inspect deepseek-v4-flash \
--format '{{json .Config.Cmd}}'
正常应该类似:
[
"vllm",
"serve",
"/workspace/DeepSeek-V4-Flash-w8a8-mtp",
"--max-model-len",
"1048576",
"--max-num-batched-tokens",
"8192"
]
不应该再出现:
"\n"
或者:
"\\"
等异常参数。
18. 检查模型 API
服务启动完成后:
curl http://127.0.0.1:8077/v1/models
正常应该返回:
{
"object": "list",
"data": [
{
"id": "deepseek-v4-flash",
"object": "model"
}
]
}
19. Chat Completion 测试
执行:
curl http://127.0.0.1:8077/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{
"model": "deepseek-v4-flash",
"messages": [
{
"role": "user",
"content": "你好,请简单介绍一下你自己。"
}
],
"temperature": 0.6,
"max_tokens": 512
}'
20. Streaming 测试
curl -N http://127.0.0.1:8077/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{
"model": "deepseek-v4-flash",
"messages": [
{
"role": "user",
"content": "请分析大语言模型推理过程中 Prefill 和 Decode 的区别。"
}
],
"stream": true,
"max_tokens": 1024
}'
21. NPU 监控
另外开启终端:
watch -n 1 npu-smi info
重点关注:
HBM Usage
NPU Utilization
Temperature
Power
Health
22. Docker 日志
查看最近 200 行:
docker logs --tail 200 deepseek-v4-flash
持续查看:
docker logs -f --tail 100 deepseek-v4-flash
23. 停止服务
docker compose down
重新启动:
docker compose up -d
强制重建容器:
docker compose up -d --force-recreate
24. 推荐调优顺序
正式压测时,不建议一次调整多个参数。
建议保持:
TP = 8
DP = 1
EP = ON
MTP = ON
Async Scheduling = ON
然后主要测试:
max-model-len
max-num-seqs
max-num-batched-tokens
gpu-memory-utilization
prefix caching
MLAPO
static kernel
推荐首先比较:
max-num-seqs = 8
max-num-seqs = 16
max-num-seqs = 32
其次比较:
max-num-batched-tokens = 4096
max-num-batched-tokens = 8192
max-num-batched-tokens = 16384
同时记录:
QPS
Input Token Throughput
Output Token Throughput
TTFT
TPOT
E2E Latency
NPU Memory
NPU Utilization
25. 推荐生产基线
社区配置属于偏性能型配置:
max-model-len = 1,048,576
max-num-batched-tokens = 8192
max-num-seqs = 16
gpu-memory-utilization = 0.95
TP = 8
DP = 1
EP = enabled
MTP = enabled
Prefix Cache = enabled
Async Scheduling = enabled
MLAPO = enabled
Static Kernel = enabled
Shared Expert Overlap = enabled
DSA CP = disabled
建议将其作为第一组 Benchmark Baseline。
如果出现 NPU OOM,建议依次调整:
1. gpu-memory-utilization
0.95 → 0.92 → 0.90
2. max-num-seqs
16 → 12 → 8
3. max-model-len
1048576 → 131072 / 65536 / 实际业务值
4. VLLM_ASCEND_ENABLE_MLAPO
1 → 0
其中 MLAPO 官方说明会以额外 NPU Memory 为代价换取 DeepSeek W8A8 场景的性能提升。
如果出现 Graph/Kernel 编译相关错误,建议优先:
enable_static_kernel:
true → false
如果启动参数解析异常,则首先执行:
docker inspect deepseek-v4-flash \
--format '{{json .Config.Cmd}}'
检查 Docker 实际传递给 vLLM 的参数。
26. 最终架构
Client
│
│ OpenAI API
▼
┌────────────────────┐
│ vLLM API │
│ :8077 │
└─────────┬──────────┘
│
▼
┌────────────────────┐
│ DeepSeek-V4-Flash │
│ W8A8 + MTP │
└─────────┬──────────┘
│
┌───────────┴───────────┐
│ │
Tensor Parallel Expert Parallel
TP = 8 EP
│ │
┌─────┴───────────────────────┴─────┐
│ │
│ Ascend NPU × 8 │
│ │
│ NPU0 NPU1 NPU2 NPU3 │
│ NPU4 NPU5 NPU6 NPU7 │
│ │
└───────────────────────────────────┘
这套配置的核心目标是:
W8A8
+
TP8 / Expert Parallel
+
MTP Speculative Decode
+
MLAPO
+
Prefix Cache
+
Async Scheduling
+
ACL Graph
+
Static Kernel
+
Shared Expert Multistream
在单机 8 卡 Ascend 环境中尽可能提高 DeepSeek-V4-Flash 的在线推理吞吐和 Decode 性能。

浙公网安备 33010602011771号