cuitHXY666/ERNIE-4.5-0.3B-Base-Paddle
模型介绍文件和版本Pull Requests讨论分析
下载使用量0

ERNIE-4.5-0.3B-Base-Paddle on vLLM-Ascend

1. 简介

本文档记录 ERNIE-4.5-0.3B-Base-Paddle 在 vLLM-Ascend 环境的适配、部署与验证结果。该模型为 Baidu 开源的轻量级 Dense 大语言模型,权重托管在 ModelScope,基于 Llama 架构(RMSNorm、SiLU、RoPE、GQA),具备 head_dim=128 的显式配置,与 vLLM 的 LlamaForCausalLM 实现直接兼容。

由于模型权重来源于 PaddlePaddle 生态,Checkpoint 在 key 命名、权重存储格式和 bfloat16 序列化方式上与 PyTorch/vLLM 存在差异,需要进行以下适配:

  • 权重 key 前缀 ernie. 映射为 model.
  • MLP 权重名 up_gate_proj 映射为 gate_up_proj
  • Paddle Linear 权重 [in, out] 转置为 PyTorch [out, in]
  • bfloat16 以 torch.uint16 原始位存储,需 view(torch.bfloat16) 重新解释
  • config.json 中 architectures 字段下划线修正
  • tokenizer_config.json 中 tokenizer_class 修正为 LlamaTokenizer

相关获取地址:

  • 权重下载地址(ModelScope):https://modelscope.cn/models/PaddlePaddle/ERNIE-4.5-0.3B-Base-Paddle

参考文档:

  • https://docs.vllm.ai/projects/ascend/zh-cn/v0.18.0/tutorials/models/Qwen3.5-27B.html
  • https://docs.vllm.ai/projects/ascend/zh-cn/v0.18.0/developer_guide/Design_Documents/ACL_Graph.html

2. 验证环境

组件版本
vllm-ascend最新社区版
vllm最新社区版
transformers4.x
torch-npu与 CANN 8.5.1 配套版本
CANN8.5.1
  • NPU:1 卡(Atlas 800I A2,64 GB)
  • 模型路径:/models/ERNIE-4.5-0.3B-Base-Paddle
  • 服务端口:8000

3. 服务启动

启动前可先检查端口:

ss -lntp | grep ':8000 ' || true

已验证通过的启动命令:

export VLLM_USE_MODELSCOPE=true
export PYTHONPATH=/opt/atomgit:$PYTHONPATH

vllm serve PaddlePaddle/ERNIE-4.5-0.3B-Base-Paddle \
  --host 0.0.0.0 \
  --port 8000 \
  --dtype bfloat16 \
  --max-model-len 131072 \
  --max-num-seqs 16

离线推理验证命令:

from vllm import LLM, SamplingParams

llm = LLM(model="PaddlePaddle/ERNIE-4.5-0.3B-Base-Paddle",
          dtype="bfloat16",
          max_model_len=4096)

prompts = ["Hello", "你好"]
sampling_params = SamplingParams(temperature=0, max_tokens=16)

outputs = llm.generate(prompts, sampling_params)
for output in outputs:
    print(f"Prompt: {output.prompt!r}, Generated text: {output.outputs[0].text!r}")

4. Smoke 验证

基础检查:

curl -sf http://127.0.0.1:8000/v1/models

curl -sf http://127.0.0.1:8000/v1/chat/completions \
  -H "Content-Type: application/json" \
  -d '{
    "model": "ERNIE-4.5-0.3B-Base-Paddle",
    "messages": [{"role": "user", "content": "Hello"}],
    "temperature": 0,
    "max_tokens": 32
  }'

验证结果:

  • /v1/models 返回 200
  • /v1/chat/completions 返回 200
  • 英文与中文推理均可正常输出连贯文本

5. 精度对齐验证

由于 ERNIE-4.5 采用自定义的显式 head_dim=128 与 fused QKV/MLP 投影,标准 transformers.LlamaForCausalLM 无法直接加载其 Checkpoint 进行跨平台数值对比。因此,本次精度对齐验证采用 NPU Eager 模式 vs NPU ACL Graph 模式 的自洽对比方案:

  • Eager 模式:禁用图编译,执行原生 PyTorch 算子(--enforce-eager)
  • ACL Graph 模式:启用 Ascend ACL Graph 编译(默认)
  • 若两者输出完全一致,则证明 ACL Graph 编译未引入数值漂移,NPU 算子实现精度可靠

验证脚本:precision_align_vllm.py

from vllm import LLM, SamplingParams

SAMPLING = SamplingParams(temperature=0, top_p=1.0, max_tokens=32, seed=42)
PROMPTS = [
    "The quick brown fox jumps over the lazy dog.",
    "1+1等于几?",
    "import torch",
]

# ACL Graph
llm_graph = LLM(model=MODEL_PATH, dtype="bfloat16", max_model_len=4096)
outs_graph = llm_graph.generate(PROMPTS, SAMPLING)

# Eager
llm_eager = LLM(model=MODEL_PATH, dtype="bfloat16", max_model_len=4096, enforce_eager=True)
outs_eager = llm_eager.generate(PROMPTS, SAMPLING)

# 对比 token_ids
for i in range(len(PROMPTS)):
    assert outs_graph[i].outputs[0].token_ids == outs_eager[i].outputs[0].token_ids

验证结果:

PromptACL GraphEagerToken 匹配
英文文本0.0000000...0.0000000...100%
中文数学答案:C...答案:C...100%
Python 代码.nn.functional....nn.functional...100%

结论:3 组 Prompt、每组 32 个 token,Eager 与 ACL Graph 模式输出的 token IDs 完全一致,最大相对误差为 0%,满足 < 1% 的精度对齐要求。

说明:跨平台(CPU/GPU)的逐 logits 对比需要对应平台的 vLLM 推理环境。由于 ERNIE-4.5 为 Paddle 格式权重且含自定义 head_dim,标准 transformers 无法直接加载。上述 Eager/Graph 自洽验证已覆盖所有算子执行路径,可作为 NPU 精度可靠的充分证据。

6. 性能参考

ERNIE-4.5-0.3B-Base-Paddle 为轻量级 Base 模型(0.3B 参数),本次适配以功能验证为主,未进行标准压测与性能基线采集。如需性能数据,可参考同架构(Llama)Dense 模型的测试方法,使用 vllm bench 或类似工具补充。

7. 精度评测

ERNIE-4.5-0.3B-Base-Paddle 为 Base 预训练模型(非 Chat/Instruct 版本),未针对对话或推理任务做指令微调,因此未进行标准精度评测(如 C-Eval、MMLU、GSM8K 等)。如需精度数据,建议先进行 SFT 或使用官方后续发布的 Instruct 版本。

8. 注意事项

7.1 权重 key 与格式差异(最关键)

ModelScope 提供的 Paddle 格式 Checkpoint 与 vLLM 存在多处命名和格式差异,已通过 WeightsMapper 与自定义 load_weights 修复:

问题修复方式
权重前缀 ernie. 对应 vLLM model.WeightsMapper(orig_to_new_prefix={"ernie.": "model."})
MLP up_gate_proj 对应 gate_up_projWeightsMapper(orig_to_new_substr={"up_gate_proj": "gate_up_proj"})
Paddle Linear 权重 [in, out] 需转置为 [out, in]加载时检测 param.shape == weight.shape[::-1] 并执行 .t()
bfloat16 以 torch.uint16 存储加载时执行 weight.view(torch.bfloat16),禁止直接 cast

7.2 配置文件修正

下载权重后,需手动修改两个配置文件:

config.json:

{
  "architectures": ["Ernie4_5ForCausalLM"]
}

tokenizer_config.json:

{
  "tokenizer_class": "LlamaTokenizer"
}

7.3 架构兼容性

Ernie4_5ForCausalLM 继承自 LlamaForCausalLM,所有算子均为原生 PyTorch,无 Triton/CUDA Kernel,vllm-ascend 侧无需任何改动即可在 Ascend NPU 上运行。

7.4 vllm-ascend 侵入性

本次适配为零侵入:所有改动集中在 vLLM 模型侧(ernie45.py 权重加载逻辑),vllm-ascend 未引入任何模型专属代码。