跳转至

Qwen3.5-Dense (Qwen3.5-2B/4B/9B)

1 简介

Qwen3.5-2B、Qwen3.5-4B 和 Qwen3.5-9B 是 Qwen3.5 系列中的稠密混合 Mamba-Transformer 语言模型。它们共享相同的混合注意力设计(GDN + 全注意力),适用于对话、内容创作和代码生成等通用文本生成任务。

本文档介绍如何在 Atlas 300I DUO 和 Atlas 200I Pro 上部署和验证这些模型,包括环境准备、Docker 安装、单节点在线部署、功能验证和调优说明。

强烈建议使用 vllm-ascend 的最新候选版本(rc)或最新正式版本。对 Qwen3.5-2B/4B/9B 在 Atlas 300I DUO 和 Atlas 200I Pro 上的支持从 vllm-ascend:v0.23.0rc1 开始。

2 支持特性

请参阅支持特性列表获取模型支持矩阵。

请参阅特性指南获取特性配置信息。

3 前提条件

3.1 模型权重

模型 版本 硬件要求 下载
Qwen3.5-2B FP16 Atlas 300I DUO 或 Atlas 200I Pro ModelScope
Qwen3.5-4B FP16 Atlas 300I DUO 或 Atlas 200I Pro ModelScope
Qwen3.5-9B FP16 Atlas 300I DUO 或 Atlas 200I Pro ModelScope
Qwen3.5-2B-W8A8-310P INT8 Atlas 300I DUO 或 Atlas 200I Pro ModelScope
Qwen3.5-4B-W8A8-310P INT8 Atlas 300I DUO 或 Atlas 200I Pro ModelScope
Qwen3.5-9B-W8A8-310P INT8 Atlas 300I DUO 或 Atlas 200I Pro ModelScope

建议将模型权重下载到本地目录,例如 /root/.cache/ 或 /home/data/。

路径说明:请将模型权重下载到您选择的目录并记录下来。确保后续部署命令中的模型路径与此目录一致。

4 安装

4.1 Docker 镜像安装

根据您的机器类型选择镜像,并在您的节点上启动 docker 镜像,请参阅使用 docker。

建议使用 vllm-ascend 镜像的最新候选版本(rc)或最新正式版本。作为最低版本要求,请使用 vllm-ascend:v0.23.0rc1-310p(或更新的 -310p)镜像。对于 openEuler 上的 Atlas 200I Pro,请使用对应的 -310p-openeuler 镜像。

在每个节点上启动 docker 镜像。

export IMAGE=m.daocloud.io/quay.io/ascend/vllm-ascend:v0.23.0-310p
docker run --rm \
    --name vllm-ascend \
    --shm-size=10g \
    --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/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 /root/.cache:/root/.cache \
    -p 8080:8080 \
    -it $IMAGE bash

在每个节点上启动 docker 镜像。根据您要使用的 NPU ID 调整 --device=/dev/davinci0。

export IMAGE=quay.io/ascend/vllm-ascend:v0.23.0-310p

docker run --rm \
--privileged \
--name vllm-ascend \
--shm-size=10g \
--device=/dev/davinci0:/dev/davinci0 \
--device=/dev/davinci_manager \
--device=/dev/ascend_manager \
--device=/dev/user_config \
-v /etc/sys_version.conf:/etc/sys_version.conf \
-v /etc/ld.so.conf.d/mind_so.conf:/etc/ld.so.conf.d/mind_so.conf \
-v /etc/hdcBasic.cfg:/etc/hdcBasic.cfg \
-v /var/dmp_daemon:/var/dmp_daemon \
-v /usr/lib64/libmmpa.so:/usr/lib64/libmmpa.so \
-v /usr/lib64/libcrypto.so.1.1:/usr/lib64/libcrypto.so.1.1 \
-v /usr/local/sbin/npu-smi:/usr/local/sbin/npu-smi \
-v /usr/lib64/libstackcore.so:/usr/lib64/libstackcore.so \
-v /usr/lib/aarch64-linux-gnu/libyaml-0.so.2:/usr/lib64/libyaml-0.so.2 \
-v /etc/slog.conf:/etc/slog.conf \
-v /var/slogd:/var/slogd \
-v /usr/local/Ascend/driver/lib64:/usr/local/Ascend/driver/lib64 \
-v /usr/lib64/libtensorflow.so:/usr/lib64/libtensorflow.so \
-v /root/.cache:/root/.cache \
-p 8080:8080 \
-it $IMAGE bash
export IMAGE=quay.io/ascend/vllm-ascend:v0.23.0-310p-openeuler

docker run --rm \
--privileged \
--name vllm-ascend \
--shm-size=10g \
--device=/dev/davinci0:/dev/davinci0 \
--device=/dev/davinci_manager \
--device=/dev/ascend_manager \
--device=/dev/user_config \
-v /etc/sys_version.conf:/etc/sys_version.conf \
-v /etc/ld.so.conf.d/mind_so.conf:/etc/ld.so.conf.d/mind_so.conf \
-v /etc/hdcBasic.cfg:/etc/hdcBasic.cfg \
-v /var/dmp_daemon:/var/dmp_daemon \
-v /usr/lib64/libsemanage.so.2:/usr/lib64/libsemanage.so.2 \
-v /usr/lib64/libmmpa.so:/usr/lib64/libmmpa.so \
-v /usr/lib64/libcrypto.so.1.1:/usr/lib64/libcrypto.so.1.1 \
-v /usr/lib64/libyaml-0.so.2.0.9:/usr/lib64/libyaml-0.so.2 \
-v /usr/local/sbin/npu-smi:/usr/local/sbin/npu-smi \
-v /usr/lib64/libstackcore.so:/usr/lib64/libstackcore.so \
-v /etc/slog.conf:/etc/slog.conf \
-v /var/slogd:/var/slogd \
-v /usr/local/Ascend/driver/lib64:/usr/local/Ascend/driver/lib64 \
-v /usr/lib64/libtensorflow.so:/usr/lib64/libtensorflow.so \
-v /root/.cache:/root/.cache \
-p 8080:8080 \
-it $IMAGE bash

在成功执行 docker run 后,可以通过执行 docker ps 命令来验证正在运行的容器服务。预期结果是容器 vllm-ascend 以状态 Up 列出,确认 docker 安装成功。

4.2 源代码安装

如果不想使用上述 docker 镜像,也可以从源代码构建所有内容:

  1. 克隆仓库并从源代码安装 vllm-ascend:

    git clone https://github.com/vllm-project/vllm-ascend.git
    cd vllm-ascend
    pip install -e .
    

    完整安装步骤请参考 安装。

    Note

    在 Atlas 300I DUO 和 Atlas 200I Pro 上,您可能需要卸载 triton-ascend 和 triton,以避免依赖冲突:

    pip uninstall -y triton-ascend triton
    

要验证源代码安装,请运行以下命令,并确认显示的版本与您安装的版本一致:

pip show vllm-ascend

预期结果:显示 vllm-ascend 的版本信息,确认安装成功。

5 在线服务部署

5.1 单节点在线部署

单节点部署在同一节点内同时完成 Prefill 和 Decode。Qwen3.5-2B、Qwen3.5-4B 和 Qwen3.5-9B 可部署在 Atlas 300I DUO 或 Atlas 200I Pro 上。

并行说明:这些平台目前支持 TP 场景。请根据可用设备选择 TP=1 或 TP=2。在仅有一个可见 NPU 的 Atlas 200I Pro 上,请使用 TP=1。

以下示例使用来自 ModelScope 的 FP16 权重。如有需要,请将 MODEL_PATH 替换为您的本地目录。

启动命令:

#!/bin/sh
# Load model from ModelScope to speed up download
export VLLM_USE_MODELSCOPE=True

# Model weight path; can be a ModelScope model id or a local directory path
# Ensure the model path matches the directory recorded during download
export MODEL_PATH=Qwen/Qwen3.5-2B

vllm serve $MODEL_PATH \
--host 127.0.0.1 \
--port 8080 \
--tensor-parallel-size 1 \
--served-model-name qwen3.5 \
--max-num-seqs 32 \
--max-model-len 16384 \
--trust-remote-code \
--gpu-memory-utilization 0.90 \
--mamba-ssm-cache-dtype float16 \
--dtype float16 \
--speculative-config '{"method": "qwen3_5_mtp","num_speculative_tokens":1}' \
--compilation-config '{"cudagraph_mode": "FULL_DECODE_ONLY", "cudagraph_capture_sizes": [2,16]}' \
--additional-config '{"ascend_compilation_config": {"enable_npugraph_ex": false}}'

启动命令:

#!/bin/sh
# Load model from ModelScope to speed up download
export VLLM_USE_MODELSCOPE=True

# Model weight path; can be a ModelScope model id or a local directory path
# Ensure the model path matches the directory recorded during download
export MODEL_PATH=Qwen/Qwen3.5-4B

vllm serve $MODEL_PATH \
--host 127.0.0.1 \
--port 8080 \
--tensor-parallel-size 1 \
--served-model-name qwen3.5 \
--max-num-seqs 32 \
--max-model-len 16384 \
--trust-remote-code \
--gpu-memory-utilization 0.90 \
--mamba-ssm-cache-dtype float16 \
--dtype float16 \
--speculative-config '{"method": "qwen3_5_mtp","num_speculative_tokens":1}' \
--compilation-config '{"cudagraph_mode": "FULL_DECODE_ONLY", "cudagraph_capture_sizes": [2,16]}' \
--additional-config '{"ascend_compilation_config": {"enable_npugraph_ex": false}}'

启动命令:

#!/bin/sh
# Load model from ModelScope to speed up download
export VLLM_USE_MODELSCOPE=True

# Model weight path; can be a ModelScope model id or a local directory path
# Ensure the model path matches the directory recorded during download
export MODEL_PATH=Qwen/Qwen3.5-9B

vllm serve $MODEL_PATH \
--host 127.0.0.1 \
--port 8080 \
--tensor-parallel-size 1 \
--served-model-name qwen3.5 \
--max-num-seqs 32 \
--max-model-len 16384 \
--trust-remote-code \
--gpu-memory-utilization 0.90 \
--mamba-ssm-cache-dtype float16 \
--dtype float16 \
--speculative-config '{"method": "qwen3_5_mtp","num_speculative_tokens":1}' \
--compilation-config '{"cudagraph_mode": "FULL_DECODE_ONLY", "cudagraph_capture_sizes": [2,16]}' \
--additional-config '{"ascend_compilation_config": {"enable_npugraph_ex": false}}'

关键参数说明:

  • --tensor-parallel-size 设置张量并行大小。在 Atlas 200I Pro 上建议 TP=1。在 Atlas 300I DUO 上,TP=1 和 TP=2 均受支持;请根据可用设备选择。
  • --max-model-len 表示上下文长度(单个请求的输入加输出)。在 Atlas 300I DUO 和 Atlas 200I Pro 上,请根据实际设备内存配置该值;设置过高可能导致 OOM。
  • --max-num-seqs 表示可并发处理的最大请求数。在 Atlas 300I DUO 和 Atlas 200I Pro 上,请根据实际设备内存配置该值;设置过高可能导致 OOM。
  • --gpu-memory-utilization 表示 vLLM 用于实际推理的 HBM 比例。在 Atlas 300I DUO 和 Atlas 200I Pro 上,请根据实际设备内存配置该值;设置过高可能导致 OOM。默认值为 0.9。
  • 在 Atlas 300I DUO 和 Atlas 200I Pro 上必须设置 --dtype float16。这些设备仅支持 FP16 数据类型。
  • --mamba-ssm-cache-dtype 设置 Mamba SSM 缓存的数据类型。在 Atlas 300I DUO 和 Atlas 200I Pro 上,仅支持 float16。
  • --speculative-config 用于包含 MTP 头的 Qwen3.5 Dense 模型,使用 qwen3_5_mtp。建议将 num_speculative_tokens 设置为 1。
  • --compilation-config 包含与 aclgraph 图模式相关的配置:
    • "cudagraph_mode":建议使用 "FULL_DECODE_ONLY"。
    • "cudagraph_capture_sizes":启用张量并行(TP)时,硬件 event-id 约束最多允许两个捕获大小(例如 [1, 8])。启用 MTP 时,每个捕获大小按 n * (num_speculative_tokens + 1) 计算,其中 n 是不启用 MTP 的部署的捕获大小。例如,当 num_speculative_tokens 为 1 时,非 MTP 大小 [1,2,4,8] 变为 [2,4,8,16]。
  • 由于这些平台不支持 enable_npugraph_ex,因此必须使用带有 "ascend_compilation_config": {"enable_npugraph_ex": false} 的 --additional-config。

常见问题提示:如果遇到问题,请参阅公共常见问题解答进行故障排查。

服务验证:

如果服务成功启动,将显示以下启动日志:

(APIServer pid=<pid>) INFO:     Started server process [<pid>]
(APIServer pid=<pid>) INFO:     Waiting for application startup.
(APIServer pid=<pid>) INFO:     Application startup complete.

6 功能验证

服务启动后,可以通过发送 Prompt 调用模型。支持两个 API 接口:completions 和 chat.completions。请使用你配置的 --served-model-name(例如 qwen3.5)。如果你使用了 --port 8080 或 -p 8080:8080,请相应调整 URL。

Completions API:

curl http://127.0.0.1:8080/v1/completions \
    -H "Content-Type: application/json" \
    -d '{
        "model": "qwen3.5",
        "prompt": "The future of AI is",
        "max_completion_tokens": 50,
        "temperature": 0
    }'

Chat Completions API:

curl http://127.0.0.1:8080/v1/chat/completions \
    -H "Content-Type: application/json" \
    -d '{
        "model": "qwen3.5",
        "messages": [
            {"role": "user", "content": "The future of AI is"}
        ],
        "max_completion_tokens": 1024,
        "temperature": 0.7,
        "top_p": 0.95
    }'

预期结果:服务返回 HTTP 200 OK。JSON 响应包含带有生成文本的 choices 字段。

7 准确率评估

7.1 使用 AISBench

  1. 有关详细信息,请参阅使用 AISBench。

  2. 执行完成后,即可获取结果。以下是 Qwen3.5-2B、Qwen3.5-4B 和 Qwen3.5-9B 在 Atlas 300I DUO 上的准确率结果,仅供参考。

准确率评估配置文件:

# Example configuration: benchmarks/ais_bench/benchmark/configs/models/vllm_api/vllm_api_general_chat.py
from ais_bench.benchmark.models import VLLMCustomAPIChat
from ais_bench.benchmark.utils.model_postprocessors import extract_non_reasoning_content

models = [
    dict(
        attr="service",
        type=VLLMCustomAPIChat,
        abbr="vllm-api-general-chat",
        path="your_model_path",
        model="qwen3.5",
        request_rate=0,
        retry=2,
        host_ip="127.0.0.1",
        host_port=8080,
        max_out_len=4096,
        batch_size=16,
        trust_remote_code=False,
        generation_kwargs=dict(
            temperature=0.0,
            ignore_eos=False,
            chat_template_kwargs = {"enable_thinking": False},
        ),
        pred_postprocessor=dict(type=extract_non_reasoning_content)
    )
]
模型 数据集 版本 指标 模式 vllm-api-general-chat
Qwen3.5-2B gsm8k - accuracy gen 77.71
Qwen3.5-2B textvqa - accuracy gen 76.09
Qwen3.5-4B gsm8k - accuracy gen 93.18
Qwen3.5-4B textvqa - accuracy gen 79.08
Qwen3.5-9B gsm8k - accuracy gen 95.30
Qwen3.5-9B textvqa - accuracy gen 82.33

8 性能评估

8.1 使用 AISBench

有关详细信息,请参阅使用 AISBench 进行性能评估。

9 性能调优

注意:以下配置仅供参考。最佳配置取决于模型大小、最大输入/输出长度以及实际设备内存。

Atlas 300I DUO / Atlas 200I Pro:目前仅支持 TP 场景。在 Atlas 200I Pro 上优先使用 TP=1。在 Atlas 300I DUO 上,TP=1 和 TP=2 均受支持;请根据可用设备选择。请根据实际设备内存配置 --max-model-len、--max-num-seqs 和 --gpu-memory-utilization;设置过高可能会导致 OOM。

9.2 调优指南

有关调优方法,请参阅公共性能调优文档。

有关详细功能说明,请参阅功能矩阵。

10 常见问题

对于常见环境、安装和通用参数问题,请参阅公共常见问题解答。

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