本仓库包含通过 vLLM-Ascend 在华为昇腾 NPU 上运行 Qwen-1_8B-Chat 的适配工作及评估结果。
Qwen-1_8B-Chat 是阿里云第一代 Qwen 大语言模型系列的 1.8B 指令微调版本。它支持最大 8K tokens 的上下文窗口,在中英文对话、文本生成和代码编写方面表现出色。
| 属性 | 值 |
|---|---|
| 模型架构 | QWenLMHeadModel |
| 隐藏层维度 | 2048 |
| 注意力头数 | 16 |
| 网络层数 | 24 |
| 最大位置嵌入 | 8192 |
| 模型类型 | 因果语言模型(仅解码器) |
| 权重来源 | ModelScope |
python -c "
from modelscope import snapshot_download
snapshot_download('qwen/Qwen-1_8B-Chat', cache_dir='./Qwen-1_8B-Chat')
"export ASCEND_RT_VISIBLE_DEVICES=0
export PYTORCH_NPU_ALLOC_CONF=expandable_segments:True
vllm serve ./Qwen-1_8B-Chat \
--host 0.0.0.0 \
--port 8000 \
--served-model-name qwen-1_8b-chat \
--trust-remote-code \
--dtype bfloat16 \
--max-model-len 8192 \
--max-num-seqs 32# Readiness check
curl -sf http://127.0.0.1:8000/v1/models
# Chat completion
curl -s http://127.0.0.1:8000/v1/chat/completions \
-H 'Content-Type: application/json' \
-d '{
"model": "qwen-1_8b-chat",
"messages": [{"role": "user", "content": "你好"}],
"temperature": 0,
"max_tokens": 32
}'示例回复:
你好,我是来自阿里云的大规模语言模型,我叫通义千问。我是一个能够回答问题、创作文字,还能表达观点、撰写代码的超大规模语言模型...
环境:
基准测试条件: 512输入/128输出/请求速率=4/提示词数量=64
| 指标 | 数值 |
|---|---|
| 持续时间 | 17.95 秒 |
| 成功请求数 | 64 |
| 失败请求数 | 0 |
| 请求吞吐量 | 3.56 请求/秒 |
| 输出令牌吞吐量 | 456.29 令牌/秒 |
| 峰值输出令牌吞吐量 | 737.00 令牌/秒 |
| 总令牌吞吐量 | 2281.47 令牌/秒 |
| 平均首次令牌生成时间(TTFT) | 64.08 毫秒 |
| 中位数首次令牌生成时间(TTFT) | 61.77 毫秒 |
| 99百分位首次令牌生成时间(TTFT) | 100.40 毫秒 |
| 平均每输出令牌时间(TPOT) | 15.71 毫秒 |
| 中位数每输出令牌时间(TPOT) | 15.96 毫秒 |
| 99百分位每输出令牌时间(TPOT) | 17.04 毫秒 |
结论: 在单张Ascend910卡上,Qwen-1_8B-Chat实现了约456令牌/秒的输出吞吐量,且首次令牌生成时间(TTFT)低于65毫秒。
| 指标 | 数值 |
|---|---|
| 数据集 | GSM8K(前20个问题) |
| 正确数 | 3 |
| 总数 | 20 |
| 准确率 | 15.0% |
注: 对于一个1.8B参数的模型在复杂多步数学推理任务上,15%的准确率在预期范围内。主要目的是验证NPU推理行为与CPU/GPU的预期是否一致。
| 问题 | 预期答案 | 结果 |
|---|---|---|
| 中国的首都是? | 北京 | 正确 |
| 1+1=? | 2 | 正确 |
| Translate Hello | 你好 | 正确 |
| 一年有几个月? | 12 | 正确 |
| 最大的行星是? | 木星 | 正确 |
中文问答准确率:5/5 = 100%
注: 此环境仅有Ascend NPU,无独立GPU。因此,CPU推理作为与NPU进行精度误差对比的基准。
为了量化NPU与CPU/GPU推理预期之间的精度误差和输出一致性,在CPU和Ascend NPU上使用了相同的模型权重、提示词和temperature=0设置。
| 问题 | CPU输出 | NPU输出 | 一致性 |
|---|---|---|---|
| 中国的首都是? | 北京 | 北京。 | 相似 |
| 1+1=? | 1+1=2。基本的算术运算... | 1+1=2。这是一个叫做加法的基本概念... | 表述不同 |
| Translate Hello | Hello! | Hello | 相似 |
| 一年有几个月? | 12个月。 | 12个月。 | 完全匹配 |
| 最大的行星是? | 木星是一颗气态巨行星... | 木星,直径约为142,984公里... | 表述不同 |
数值精度指标(单次前向传播):
| 指标 | 数值 | 阈值 | 结果 |
|---|---|---|---|
| Top-1令牌一致性 | 100.00% | > 99% | 通过 |
| 困惑度相对差异 | 0.0007% | < 1% | 通过 |
| 隐藏状态余弦相似度 | 1.000000 | > 0.9999 | 通过 |
| KL散度 | -0.000013 | ≈ 0 | 通过 |
文本级一致性(自回归生成):
| 指标 | 数值 |
|---|---|
| 完全匹配 | 1 / 5 = 20.0% |
| 语义相似度 | 2 / 5 = 40.0% |
| 总体一致性 | 3 / 5 = 60.0% |
| 事实错误率 | 0% |
误差分析:
| 评估项 | 样本数 | 结果 | 说明 |
|---|---|---|---|
| GSM8K(子集) | 20 | 15.0% | 对于1.8B模型属于正常水平 |
| 中文常识 | 5 | 100% | 语义理解能力已验证 |
| CPU与NPU对比 | 5 | 整体一致性60% | 语义匹配;差异仅存在于措辞 |
NPU精度结论: 模型在昇腾NPU上的推理行为与其预期能力一致。未观察到性能下降或输出乱码现象。
QWenLMHeadModel 在vLLM(qwen.py)中得到原生支持,无需CUDA/Triton内核。--trust-remote-code。 模型配置包含用于自定义分词器代码的auto_map。.
├── Qwen-1_8B-Chat-vLLM-Ascend-Evaluation-Report.md # Full evaluation report
├── docs/
│ └── source/
│ └── tutorials/
│ └── models/
│ └── Qwen-1_8B-Chat.md # Tutorial documentation
├── tests/
│ └── e2e/
│ └── models/
│ └── configs/
│ └── Qwen-1_8B-Chat.yaml # Test configuration
└── README.md # This fileMIT