跳转至

DeepSeek-V4.1-Flash

1 简介

DeepSeek-V4.1-Flash 是一个原生多模态混合专家(MoE)模型,具有 552B 主干参数,上下文长度最高可达一百万个 token。它采用 40 层因果编码器-解码器(CED)架构,包含 20 层因果编码器层和 20 层解码器层,在 Prefill 期间每个 token 激活 8B 参数,在 Decode 期间激活 16B 参数。

该模型引入了压缩稀疏注意力 2(CSA2)、FP4 主 KV 缓存、SWA 有界重放、单遍 mHC、Engram 条件记忆以及 DSpark 推测解码。这些设计将全局 KV 缓存占用降低到每个 token 890 字节,并将持久 KV 缓存占用降低至约为 DeepSeek-V4-Flash 的八分之一。该模型接受文本和图像,并支持从 1 到 100 连续可调的推理力度。

vLLM Ascend 支持在两台 Atlas 800 A3 服务器或四台 Atlas 800 A2 服务器上进行 W8A8 共置部署。单台 A3 服务器可使用下文所述的 Engram 主机卸载。本指南不涵盖 Prefill-Decode 分离部署。

2 支持的功能

有关完整的支持矩阵,请参阅 支持模型;有关功能配置,请参阅 功能指南。

本指南中的配置已通过 W8A8 权重、INT8 Engram 存储、TP8/DP4/EP32、DSpark 推测解码以及 FULL_DECODE_ONLY ACL Graph 验证。它使用模型运行器 V1,并支持自动前缀缓存。

3 前提条件

3.1 模型权重与硬件

官方 DeepSeek-V4.1-Flash 检查点可从 Hugging Face 和 ModelScope 获取。

本指南使用的 Ascend W8A8 检查点将作为 Eco-Tech/DeepSeek-V4.1-Flash-w8a8 发布在 ModelScope 上。它包含 DSpark 草稿参数和 INT8 Engram 表。 检查点可用后,请将其下载到每台服务器上的相同绝对路径;示例中使用 <YOUR_MODEL_PATH>。

或者,使用 ModelSlim 从官方权重准备一个兼容 ModelSlim 的 W8A8 检查点。

使用以下硬件配置之一:

  • A3 系列:两台 Atlas 800 A3 服务器。每台服务器有 8 个 NPU,每个 NPU 具有 128GB 内存,并向容器暴露 16 个逻辑设备。
  • A2 系列:四台 Atlas 800 A2 服务器。每台服务器有 8 个 NPU,每个 NPU 具有 64GB 内存,并向容器暴露 8 个设备。

将检查点存储在共享目录中,或将其复制到每台服务器上的相同绝对路径。

3.2 验证多节点通信

部署前,请按照 验证多节点通信 操作。所有服务器都必须能够通过所选网络接口进行通信,并且服务端口不得被阻止。

4 安装

4.1 Docker 镜像安装

选择目标硬件对应的选项卡。A2 和 A3 使用不同的验证镜像。

一台 A3 服务器暴露 16 个逻辑设备。请在两台 A3 服务器上运行此命令。

export IMAGE=quay.io/ascend/vllm-ascend:deepseek-v4.1-flash-a3
export MODEL_ROOT="/data/weights"

docker pull "$IMAGE"

docker run --rm -it \
  --name deepseek-v41 \
  --net=host \
  --shm-size=512g \
  --privileged=true \
  --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/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_ROOT:$MODEL_ROOT" \
  "$IMAGE" bash

一台 A2 服务器暴露 8 个设备。请在所有四台 A2 服务器上运行此命令。

export IMAGE=quay.io/ascend/vllm-ascend:deepseek-v4.1-flash
export MODEL_ROOT="/data/weights"

docker pull "$IMAGE"

docker run --rm -it \
  --name deepseek-v41 \
  --net=host \
  --shm-size=512g \
  --privileged=true \
  --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/davinci_manager \
  --device /dev/devmm_svm \
  --device /dev/hisi_hdc \
  -v /usr/local/dcmi:/usr/local/dcmi \
  -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_ROOT:$MODEL_ROOT" \
  "$IMAGE" bash

如果检查点存储在其他位置,请更改 MODEL_ROOT。请保持每个容器内外使用相同的绝对路径。

4.2 源代码安装

要从源代码构建,请遵循 软件环境安装指南 ,并使用 main 分支,同时采用 .github/vllm-main-verified.commit 中记录的匹配 vLLM 修订版本。

5 在线服务部署

5.1 多节点共置部署

A3 和 A2 配置使用相同的全局 DP4/TP8/EP32 拓扑。A3 在两台服务器中的每一台上放置两个本地 DP 秩;A2 在四台服务器中的每一台上放置一个本地 DP 秩。

选择目标硬件对应的选项卡。在每个脚本中,修改 NODE_RANK、 NODE0_IP、LOCAL_IP、NIC_NAME 和 MODEL_PATH。节点 0 暴露 API; 其他所有节点都是无头工作节点。

在两台 A3 服务器上运行此脚本。在节点 0 上设置 NODE_RANK=0, 在节点 1 上设置 NODE_RANK=1。

#!/usr/bin/env bash
set -euo pipefail

NODE_RANK=0
NODE0_IP="<NODE0_IP>"
LOCAL_IP="<LOCAL_IP>"
NIC_NAME="<NETWORK_INTERFACE>"
MODEL_PATH="<YOUR_MODEL_PATH>"

# Allow time for weight loading and graph capture on large models.
export VLLM_ENGINE_READY_TIMEOUT_S="${VLLM_ENGINE_READY_TIMEOUT_S:-3600}"
export HCCL_IF_IP="$LOCAL_IP"
export GLOO_SOCKET_IFNAME="$NIC_NAME"
export TP_SOCKET_IFNAME="$NIC_NAME"
export HCCL_SOCKET_IFNAME="$NIC_NAME"
export ASCEND_RT_VISIBLE_DEVICES=0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15

if [[ -f /usr/lib/aarch64-linux-gnu/libjemalloc.so.2 ]]; then
  export LD_PRELOAD="/usr/lib/aarch64-linux-gnu/libjemalloc.so.2${LD_PRELOAD:+:$LD_PRELOAD}"
fi

DP_START_RANK=$((NODE_RANK * 2))
HEADLESS_ARGS=()
if [[ "$NODE_RANK" != "0" ]]; then
  HEADLESS_ARGS+=(--headless --data-parallel-start-rank "$DP_START_RANK")
fi

vllm serve "$MODEL_PATH" \
  --host 0.0.0.0 \
  --port 8000 \
  "${HEADLESS_ARGS[@]}" \
  --data-parallel-address "$NODE0_IP" \
  --data-parallel-rpc-port 13399 \
  --data-parallel-size 4 \
  --data-parallel-size-local 2 \
  --tensor-parallel-size 8 \
  --enable-expert-parallel \
  --served-model-name deepseek-v41 \
  --max-model-len 1048576 \
  --max-num-batched-tokens 4096 \
  --max-num-seqs 32 \
  --gpu-memory-utilization 0.90 \
  --block-size 128 \
  --tokenizer-mode deepseek_v41 \
  --reasoning-parser deepseek_v41 \
  --tool-call-parser deepseek_v41 \
  --enable-auto-tool-choice \
  --trust-remote-code \
  --model-loader-extra-config '{"enable_multithread_load":true,"num_threads":128}' \
  --safetensors-load-strategy lazy \
  --quantization ascend \
  --additional-config '{"enable_cpu_binding":true,"ascend_compilation_config":{"enable_npugraph_ex":false,"enable_static_kernel":false}}' \
  --speculative-config '{"method":"dspark","num_speculative_tokens":5,"enforce_eager":true}' \
  --compilation-config '{"cudagraph_mode":"FULL_DECODE_ONLY"}'

在所有四台 A2 服务器上运行此脚本。在相应节点上将 NODE_RANK 设置为 0、1、2、 或 3。

#!/usr/bin/env bash
set -euo pipefail

NODE_RANK=0
NODE0_IP="<NODE0_IP>"
LOCAL_IP="<LOCAL_IP>"
NIC_NAME="<NETWORK_INTERFACE>"
MODEL_PATH="<YOUR_MODEL_PATH>"

# Allow time for weight loading and graph capture on large models.
export VLLM_ENGINE_READY_TIMEOUT_S="${VLLM_ENGINE_READY_TIMEOUT_S:-3600}"
export HCCL_IF_IP="$LOCAL_IP"
export GLOO_SOCKET_IFNAME="$NIC_NAME"
export TP_SOCKET_IFNAME="$NIC_NAME"
export HCCL_SOCKET_IFNAME="$NIC_NAME"
export ASCEND_RT_VISIBLE_DEVICES=0,1,2,3,4,5,6,7

if [[ -f /usr/lib/aarch64-linux-gnu/libjemalloc.so.2 ]]; then
  export LD_PRELOAD="/usr/lib/aarch64-linux-gnu/libjemalloc.so.2${LD_PRELOAD:+:$LD_PRELOAD}"
fi

HEADLESS_ARGS=()
if [[ "$NODE_RANK" != "0" ]]; then
  HEADLESS_ARGS+=(--headless --data-parallel-start-rank "$NODE_RANK")
fi

vllm serve "$MODEL_PATH" \
  --host 0.0.0.0 \
  --port 8000 \
  "${HEADLESS_ARGS[@]}" \
  --data-parallel-address "$NODE0_IP" \
  --data-parallel-rpc-port 13399 \
  --data-parallel-size 4 \
  --data-parallel-size-local 1 \
  --tensor-parallel-size 8 \
  --enable-expert-parallel \
  --served-model-name deepseek-v41 \
  --max-model-len 1048576 \
  --max-num-batched-tokens 4096 \
  --max-num-seqs 32 \
  --gpu-memory-utilization 0.90 \
  --block-size 128 \
  --tokenizer-mode deepseek_v41 \
  --reasoning-parser deepseek_v41 \
  --tool-call-parser deepseek_v41 \
  --enable-auto-tool-choice \
  --trust-remote-code \
  --model-loader-extra-config '{"enable_multithread_load":true,"num_threads":128}' \
  --safetensors-load-strategy lazy \
  --quantization ascend \
  --additional-config '{"enable_cpu_binding":true,"ascend_compilation_config":{"enable_npugraph_ex":false,"enable_static_kernel":false}}' \
  --speculative-config '{"method":"dspark","num_speculative_tokens":5,"enforce_eager":true}' \
  --compilation-config '{"cudagraph_mode":"FULL_DECODE_ONLY"}'

在节点 0 上省略 --data-parallel-start-rank:即使指定 0, 也会在固定版本的 vLLM CLI 中选择混合负载均衡,这与无头远程引擎不兼容。仅在无头节点上设置起始秩。

先启动节点 0,然后启动其余节点。两种配置的全局拓扑均为 DP4/TP8/EP32:

  • A3 系列:两台服务器,每台服务器本地 DP2,每台服务器 16 个可见逻辑 设备。
  • A2 系列:四台服务器,每台服务器本地 DP1,每台服务器 8 个可见设备。

每个 DP 秩通过 TP8 使用八个设备。只有节点 0 暴露 API 端点。

等待每个 DP 引擎完成权重加载和图捕获。成功启动时,输出类似于:

INFO:     Started server process
INFO:     Waiting for application startup.
INFO:     Application startup complete.

5.2 服务验证

在节点 0 上,验证健康端点:

curl -sS -o /dev/null -w 'HTTP %{http_code}\n' \
  http://127.0.0.1:8000/health

预期输出:

HTTP 200

然后验证已配置的模型是否可用:

curl -sS http://127.0.0.1:8000/v1/models | \
  jq '{object, models: [.data[] | {id, object}]}'

响应必须包含一个 id 为 deepseek-v41 的模型条目。

5.3 单个 A3 的 Engram 主机卸载

确保 INT8 Engram 权重及其 scale 张量在检查点中可用。必须使用 --safetensors-load-strategy lazy,以避免在每个 rank 上立即物化整个表。

对于单个 A3,在所有 16 个逻辑设备上使用 TP8/DP2/EP16,并使两个 DP 副本均为本地(--data-parallel-size 2 --data-parallel-size-local 2)。保留 model runner V1、FULL_DECODE_ONLY 以及 DSpark 的 eager draft 执行。使用 INT8 Engram 表,并通过 vLLM 的 Engram 配置开启卸载。这需要支持 --engram-config 的 vLLM;如果没有该参数,表将保留在设备上:

--engram-config '{"cpu_offload": true}'

使用 cpu_offload 时,分片保留在主机内存中,并通过 aclrtHostRegisterV2 注册,NPU gather 内核通过 aclrtHostGetDevicePointer 返回的设备地址读取它,因此卸载的表既不需要 H2D 拷贝,也不需要主机侧 gather。

初始配置为每个 DP 副本 4 个序列、512 个批处理 token、131072 模型长度,以及每个 rank 1 GiB 的 KV 缓存,并禁用前缀缓存。确保主机 RAM 足够容纳所有压缩 Engram 分片和运行时内存;CPU/NUMA 页面迁移可能会使启动时间增加数分钟。

该配置通过了模型加载、decode 图捕获、自然文本请求以及混合长度并发请求冒烟测试。这些检查不能证明数据集准确性或性能。其他 Engram 存储格式和 model runner V2 未包含在本次冒烟验证中。

6 功能验证

6.1 文本请求

curl -sS http://127.0.0.1:8000/v1/chat/completions \
  -H 'Content-Type: application/json' \
  -d '{
    "model": "deepseek-v41",
    "messages": [{"role": "user", "content": "Who are you?"}],
    "temperature": 0,
    "max_completion_tokens": 256
  }' | jq -e '.choices[0].message.content | length > 0'

预期输出:

true

6.2 图像请求

将 IMAGE_URL 设置为可从节点 0 访问的 HTTP(S) 图像 URL,并发送多模态请求:

export IMAGE_URL="<YOUR_IMAGE_URL>"

curl -sS http://127.0.0.1:8000/v1/chat/completions \
  -H 'Content-Type: application/json' \
  -d "{
    \"model\": \"deepseek-v41\",
    \"messages\": [{
      \"role\": \"user\",
      \"content\": [
        {\"type\": \"image_url\", \"image_url\": {\"url\": \"${IMAGE_URL}\"}},
        {\"type\": \"text\", \"text\": \"Describe this image.\"}
      ]
    }],
    \"temperature\": 0,
    \"max_completion_tokens\": 256
  }" | jq -e '.choices[0].message.content | length > 0'

预期输出:

true

7 准确性评估

请参考 使用 AISBench 来评估已部署的服务。目前尚未发布该配置的 vLLM Ascend 任务级准确性结果。报告结果时,请记录检查点、prompt encoder、reasoning effort、采样参数、数据集版本,以及是否启用 DSpark。

8 性能评估

请参考 AISBench 性能评估指南 或 vLLM 基准测试指南。目前尚未发布该配置的生产性能基线。

9 性能调优

第 5.1 节中的数值是经过验证的起点,而非全局最优设置。针对目标输入长度、图像尺寸、输出长度和并发度,请同时调整 --max-num-seqs、--max-num-batched-tokens 和 --gpu-memory-utilization。在替代配置经过验证之前,请保持文档中记录的 DP4/TP8/EP32 拓扑、--block-size 128 和 FULL_DECODE_ONLY 模式。

10 常见问题

如何启用工具调用和推理解析?

在 serving 命令中保留以下选项:

--tokenizer-mode deepseek_v41 \
--tool-call-parser deepseek_v41 \
--reasoning-parser deepseek_v41 \
--enable-auto-tool-choice

对于常见的环境、安装和参数问题,请参考 公共常见问题。

11 限制

  • 文档中的部署使用两台 Atlas 800 A3 服务器或四台 Atlas 800 A2 服务器,并使用带有 INT8 Engram 存储的 Ascend W8A8 检查点。
  • 本指南不支持 Prefill-Decode 分离、流水线并行和 model runner V2。
  • DSpark draft 执行以 eager 模式运行,而目标模型使用 FULL_DECODE_ONLY ACL Graph。
  • 生产性能认证和任务级准确性评估尚未完成。

本页原文 Markdown:在 AtomGit 查看·内容源自开源项目 vl/vllm-ascend