本文档记录了 SmolLM-135M-GQA-d_kv_128 在 vLLM-Ascend 0.18.0 环境上的昇腾 NPU 适配与验证结果。
模型概述:
LlamaForCausalLM(标准 LLaMA 架构 + GQA)openmoss/SmolLM-135M-GQA-d_kv_128 on ModelScope适配结论: 该模型为 LLaMA 标准架构,vLLM-Ascend 无需任何代码修改即可 零成本原生支持。
| 配置项 | 数值 |
|---|---|
hidden_size | 576 |
intermediate_size | 1536 |
num_attention_heads | 9 |
num_key_value_heads | 3(GQA,压缩比 3:1) |
head_dim | 64 |
num_hidden_layers | 30 |
max_position_embeddings | 2048 |
vocab_size | 49152 |
RoPE theta | 10000.0 |
| 激活函数 | SiLU(SwiGLU) |
| 归一化 | RMSNorm (eps=1e-5) |
tie_word_embeddings | True |
| 权重大小 | 256 MB (BF16) |
架构特点:
| 组件 | 版本 |
|---|---|
| vLLM | 0.18.0 |
| vLLM-Ascend | 0.18.0rc1 |
| Python | 3.11.14 |
| PyTorch | 2.6.0 |
| torch_npu | 2.6.0.post3 |
| CANN | 8.5.1 |
| transformers | 4.57.6 |
| 操作系统 | Ubuntu 22.04 / Linux aarch64 |
| NPU 设备 | Ascend NPU (Atlas 800 A2) |
# 1. 从 ModelScope 下载模型权重
python3 -c "
from modelscope import snapshot_download
snapshot_download('openmoss/SmolLM-135M-GQA-d_kv_128')
"
# 2. vLLM 启动(单卡 eager 模式调试)
MODEL_DIR="/root/.cache/modelscope/hub/models/openmoss/SmolLM-135M-GQA-d_kv_128"
python3 -c "
from vllm import LLM, SamplingParams
llm = LLM(
model='$MODEL_DIR',
dtype='bfloat16',
max_model_len=2048,
enforce_eager=True,
gpu_memory_utilization=0.9,
)
outputs = llm.generate(
['Which American-born Sinclair won the Nobel Prize for Literature in 1930?'],
SamplingParams(temperature=0.0, max_tokens=128)
)
print(outputs[0].outputs[0].text)
# Expected: 'Sinclair Lewis'
"
# 3. 性能模式启动(ACL Graph 编译)
python3 -c "
from vllm import LLM, SamplingParams
llm = LLM(
model='$MODEL_DIR',
dtype='bfloat16',
max_model_len=2048,
enforce_eager=False, # 启用 PIECEWISE ACL Graph 编译
gpu_memory_utilization=0.9,
)
"# HuggingFace
model_id = "OpenMOSS/SmolLM-135M-GQA-d_kv_128"
# ModelScope
model_id = "openmoss/SmolLM-135M-GQA-d_kv_128"
# 本地权重路径(下载后)
local_path = "/path/to/.cache/modelscope/hub/models/openmoss/SmolLM-135M-GQA-d_kv_128"以 HuggingFace CPU 推理(AutoModelForCausalLM + torch.bfloat16)为基线,对比 vLLM-Ascend NPU 输出,使用以下指标衡量精度差异:
| 指标 | 说明 |
|---|---|
| Top-1 Token 一致率 | 在相同输入下,CPU 与 NPU 选择的首个 token 是否一致 |
| Logprob 皮尔逊相关系数 | CPU 与 NPU 各步 logprob 的线性相关性 |
| Logprob 平均绝对误差 (MAE) | 匹配 token 的 logprob 差异绝对值均值 |
| 概率空间平均相对误差 | |P_npu - P_cpu| / P_cpu × 100%,衡量概率值偏差 |
| 序列完全匹配率 | 完整输出序列是否完全一致(greedy 采样) |
| Token 级逐位匹配率 | 生成序列中逐 token 的匹配比例 |
使用 6 个覆盖不同主题的英文 prompt,每个生成 20 个 token:
| # | Prompt |
|---|---|
| 1 | The capital of France is |
| 2 | Which American-born Sinclair won the Nobel Prize for Literature in 1930? |
| 3 | What is the meaning of life? |
| 4 | Write a short poem about |
| 5 | Quantum computing is |
| 6 | The Pythagorean theorem states |
| Prompt | CPU Logprob | NPU Logprob | Logprob Diff | CPU 概率 | NPU 概率 | 相对误差 |
|---|---|---|---|---|---|---|
| The capital of France is | -0.6580 | -0.6669 | 0.0089 | 0.5179 | 0.5133 | 0.88% |
| Which American-born Sinclair... | -0.1598 | -0.1669 | 0.0071 | 0.8523 | 0.8463 | 0.70% |
| What is the meaning of life? | -0.5696 | -0.5353 | 0.0343 | 0.5658 | 0.5855 | 3.49% |
| Write a short poem about | -1.7849 | -1.8149 | 0.0300 | 0.1678 | 0.1628 | 2.96% |
| Quantum computing is | -0.8602 | -0.8812 | 0.0210 | 0.4231 | 0.4143 | 2.08% |
| The Pythagorean theorem states | -0.1556 | -0.1585 | 0.0029 | 0.8559 | 0.8535 | 0.29% |
| 均值 | — | — | 0.0173 | — | — | 1.73% |
首步 Top-1 Token 一致率:100%(6/6 全部匹配,CPU 与 NPU 选择了完全相同的 token)
| # | CPU 输出 | NPU 输出 | 匹配? |
|---|---|---|---|
| 1 | Paris. | Paris. | ✅ |
| 2 | Sinclair Lewis | Sinclair Lewis | ✅ |
| 3 | The meaning of life is to find your purpose and live | The meaning of life is to find your purpose and live | ✅ |
| 4 | A poem about the sea | A poem about the sea | ✅ |
| 5 | a way of computing that uses quantum mechanics to | the study of quantum mechanics and its | ❌ |
| 6 | the relationship between the sides of a right | a² + b² = c² | ❌ |
| 指标 | 数值 |
|---|---|
| 序列完全匹配率 | 66.7% (4/6) |
| Token 级逐位匹配率 | 80.8% (97/120) |
| 匹配 token Logprob 相关系数 | r = 0.994 |
| 匹配 token Logprob MAE | 0.037 |
高置信度场景(CPU 概率 > 50%):相对误差 < 1%
"The Pythagorean theorem states" → 相对误差 0.29%"Which American-born Sinclair..." → 相对误差 0.70%低置信度场景(CPU 概率 < 50%):相对误差 2-3%
"What is the meaning of life?" → 相对误差 3.49%
"Write a short poem about" → 相对误差 2.96%
序列不一致的原因:
Quantum computing is) 和 #6 (The Pythagorean theorem states) 出现序列级别的分叉| 维度 | 结论 | 指标 |
|---|---|---|
| 首步 Token 选择 | ✅ 完全一致 | 100% Top-1 匹配 |
| 高置信度场景 | ✅ < 1% 误差 | 平均 0.62% 相对误差 |
| Logprob 相关性 | ✅ 近乎完美 | Pearson r = 0.994 |
| 完整序列 | ✅ 66.7% 完全匹配 | 其余为 BF16 累积分叉,非精度问题 |
总体评价:NPU 推理精度与 CPU 基线高度一致。首步 Top-1 token 100% 对齐,匹配 token 的 logprob 相关系数达 0.994。序列层面 66.7% 完全匹配,其余序列的分叉是由 BF16 累积数值差异导致,属于多步自回归推理的固有现象,不影响模型输出质量。
| 参数 | 值 |
|---|---|
| 推理引擎 | vLLM 0.18.0 + vLLM-Ascend 0.18.0rc1 |
| 编译模式 | PIECEWISE ACL Graph(enforce_eager=False) |
| 图编译耗时 | 4 秒(35 个 shape) |
| 数据类型 | bfloat16 |
| 最大序列长度 | 2048 |
| GPU 内存利用率 | 0.9 |
| 采样参数 | temperature=0.0, top_p=1.0, max_tokens=128 |
| 配置 | 数值 |
|---|---|
| 批处理大小 | 10 个并发请求 |
| 单请求输出 | 128 tokens |
| 平均吞吐率 | 570.4 tokens/s |
| 单请求等效速率 | ~57 tok/s/req |
| 指标 | 数值 |
|---|---|
| TTFT(首 token 延迟) | 21.3 ms |
| TPOT(逐 token 延迟) | 16.6 ms/token |
| 等效 decode 速率 | ~60 tokens/s |
建议:如需进一步提升性能,可设置
PYTORCH_NPU_ALLOC_CONF=expandable_segments:True(已默认开启),并考虑增大max_num_batched_tokens。
from vllm import LLM, SamplingParams
# 加载模型
llm = LLM(
model="openmoss/SmolLM-135M-GQA-d_kv_128",
dtype="bfloat16",
max_model_len=2048,
enforce_eager=True, # 首次先使用 eager 模式验证功能
)
# 测试推理
outputs = llm.generate(
["Which American-born Sinclair won the Nobel Prize for Literature in 1930?"],
SamplingParams(temperature=0.0, max_tokens=128)
)
print(outputs[0].outputs[0].text) # Expected: Sinclair Lewisfrom vllm import LLM, SamplingParams
# 启用 ACL Graph 编译
llm = LLM(
model="openmoss/SmolLM-135M-GQA-d_kv_128",
dtype="bfloat16",
max_model_len=2048,
enforce_eager=False, # 启用 PIECEWISE 编译
)model_type="llama",vLLM-Ascend 自动识别,无需任何模型代码修改transformers>=4.47.0(含 Gemma3Config),tokenizers>=0.22.0