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 性能。

posted @ 2026-07-13 16:05  fengzeng  阅读(818)  评论(0)    收藏  举报