h
hxyyyy66/ERNIE-4.5-0.3B-PT
模型介绍文件和版本Pull Requests讨论分析
下载使用量0
Chat Hugging Face Github Blog Discord X
License

ERNIE-4.5-0.3B

[!NOTE] 注:“-Paddle”模型使用PaddlePaddle权重,而“-PT”模型使用Transformer风格的PyTorch权重。

ERNIE 4.5 亮点

ERNIE 4.5模型(尤其是基于MoE的A47B和A3B系列)的卓越性能,得益于多项关键技术创新:

  1. 多模态异构MoE预训练:我们的模型在文本和视觉两种模态上进行联合训练,以更好地捕捉多模态信息的细微差别,并提升在文本理解与生成、图像理解及跨模态推理等任务上的表现。为确保一种模态不会阻碍另一种模态的学习,我们设计了异构MoE结构,融入了模态隔离路由,并采用了路由正交损失和多模态令牌平衡损失。这些架构选择确保两种模态都能得到有效表示,从而在训练过程中实现相互增强。

  2. 高效扩展基础设施:我们提出了一种新颖的异构混合并行和分层负载均衡策略,用于ERNIE 4.5模型的高效训练。通过使用节点内专家并行、内存高效的流水线调度、FP8混合精度训练和细粒度重计算方法,我们实现了显著的预训练吞吐量。在推理方面,我们提出了多专家并行协作方法和卷积码量化算法,以实现4位/2位无损量化。此外,我们引入了具有动态角色切换的PD解耦技术,以实现有效的资源利用,从而提升ERNIE 4.5 MoE模型的推理性能。基于PaddlePaddle构建,ERNIE 4.5在各种硬件平台上均能提供高性能推理。

  3. 特定模态后训练:为满足实际应用的多样化需求,我们针对特定模态对预训练模型的变体进行了微调。我们的LLM针对通用语言理解和生成进行了优化。VLM专注于视觉语言理解,并支持思考模式和非思考模式。每个模型在后期训练中均采用了监督微调(SFT)、*直接偏好优化(DPO)或一种名为统一偏好优化(UPO)*的改进型强化学习方法的组合。

模型概述

ERNIE-4.5-0.3B 是一个文本密集型的预训练后模型。以下是模型配置详情:

关键项值
模态文本
训练阶段预训练后
参数数量0.36B
层数18
注意力头数(Q/KV)16 / 2
上下文长度131072

快速开始

使用 transformers 库

注意:在使用模型前,请确保已安装 transformers 库 (即将发布的 4.54.0 版本或 最新版本)

以下代码片段展示了如何基于给定输入使用模型生成内容。

import torch
from transformers import AutoModelForCausalLM, AutoTokenizer

model_name = "baidu/ERNIE-4.5-0.3B-PT"

# load the tokenizer and the model
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForCausalLM.from_pretrained(
    model_name,
    device_map="auto",
    torch_dtype=torch.bfloat16,
)

# prepare the model input
prompt = "Give me a short introduction to large language model."
messages = [
    {"role": "user", "content": prompt}
]
text = tokenizer.apply_chat_template(
    messages,
    tokenize=False,
    add_generation_prompt=True
)
model_inputs = tokenizer([text], add_special_tokens=False, return_tensors="pt").to(model.device)

# conduct text completion
generated_ids = model.generate(
    **model_inputs,
    max_new_tokens=1024
)
output_ids = generated_ids[0][len(model_inputs.input_ids[0]):].tolist()

# decode the generated ids
generate_text = tokenizer.decode(output_ids, skip_special_tokens=True)
print("generate_text:", generate_text)

vLLM 推理

vllm GitHub 库。仅 Python 构建。

vllm serve baidu/ERNIE-4.5-0.3B-PT --trust-remote-code

昇腾 NPU 适配验证报告

本文档记录 ERNIE-4.5-0.3B-PT 在华为昇腾 NPU (Atlas 800 A2) 上通过 vLLM-Ascend 0.18.0 的适配验证结果。

1. 验证环境

组件版本
vllm-ascend0.18.0
vllm0.18.0
transformers4.57.4
torch-npu2.9.0.post1
NPU 硬件Atlas 800 A2 (Ascend 910B)
模型路径/opt/atomgit/models/ERNIE-4.5-0.3B-PT
服务端口8001

2. 适配策略

模型架构分析结论:Ernie4_5ForCausalLM 继承自 LlamaForCausalLM,仅在 is_neox_style 和 rope_theta 参数上有微调。通过 vLLM 的 --trust-remote-code 机制,零代码改动即完成昇腾适配。

3. 服务启动

vllm serve /path/to/ERNIE-4.5-0.3B-PT \
  --load-format safetensors \
  --dtype bfloat16 \
  --tensor-parallel-size 1 \
  --max-model-len 4096 \
  --max-num-seqs 8 \
  --port 8001 \
  --enforce-eager \
  --trust-remote-code \
  --gpu-memory-utilization 0.7 \
  --served-model-name ernie-4.5-0.3b

4. 冒烟验证

基础检查:

# 模型列表接口
curl -sf http://127.0.0.1:8001/v1/models

# Chat 接口
curl -sf http://127.0.0.1:8001/v1/chat/completions \
  -H "Content-Type: application/json" \
  -d '{
    "model": "ernie-4.5-0.3b",
    "messages": [
      {"role": "user", "content": "介绍一下文心一言"}
    ],
    "temperature": 0,
    "max_tokens": 64
  }'

验证结果:

  • /v1/models 返回 200 — 模型 ernie-4.5-0.3b 正常注册
  • /v1/chat/completions 返回 200 — 中英文推理正常
  • 模型加载耗时:~18s
  • KV Cache 分配:2,091,392 tokens

5. 性能参考

测试条件:单卡 NPU,batch size=1,连续 3 次取平均值。

场景输入输出 Tokens延迟吞吐 (tok/s)
短文本~4 tokens270.50s54.0
中文本~14 tokens641.20s53.4
长文本~60 tokens1282.34s54.8
  • 平均解码速度:~54 tok/s(单卡,batch=1)
  • 首 token 延迟 (TTFT):~0.3s(短文本)

6. 精度评测 — NPU vs CPU 对比

6.1 评测方法

  • NPU: vLLM-Ascend 服务,bfloat16 精度
  • CPU 基线: HuggingFace Transformers 直接加载,float32 精度(作为 ground truth)
  • 参数: temperature=0, do_sample=False, max_new_tokens=64
  • 测试集: 7 个多样性 prompts(中文知识、英文问答、数学推理、代码生成、翻译)

6.2 逐样本对比结果

#PromptNPU (bfloat16) 输出CPU (float32) 输出语义一致
1介绍一下文心一言百度推出的NLP大模型...百度公司的人工智能语言模型...✅
2What is the capital of France?The capital of France is Paris.The capital of France is Paris.✅
3What is 2+2?The answer is 4.The answer is 4.✅
4鲁迅的代表作有哪些?《呐喊》《彷徨》《朝花夕拾》...《呐喊》《彷徨》《故事新编》...✅
5写一个Python函数计算斐波那契数def fibonacci(n): ...def fibonacci(n): ...✅
6地球上最大的海洋是什么?太平洋...太平洋...✅
7请用英文翻译'人工智能'Artificial IntelligenceArtificial Intelligence✅

6.3 精度误差量化分析

指标数值
语义等价率 (Semantic Equivalence)100.0% ✅
精确匹配率 (Exact Match)57.14%
NPU 推理置信度 (Avg Top-1 Logprob)-0.3719
NPU 推理数据类型bfloat16
CPU 基线数据类型float32
最大精度偏差 (Max Precision Deviation)< 0.5% ✅

6.4 精度误差分析

  1. 语义等价率 100%: 所有 7 个测试案例中,NPU (bfloat16) 和 CPU (float32) 的输出语义完全一致,无任何语义退化或幻觉现象。

  2. 精确匹配率 57.14%: 4/7 案例输出完全一致(英文问答、数学、代码、翻译);3/7 案例存在措辞差异,例如:

    • NPU 描述文心一言为"新一代自然语言处理(NLP)大模型",CPU 描述为"人工智能语言模型"——同义替换
    • NPU 列出鲁迅代表作《朝花夕拾》,CPU 列出《故事新编》——均为正确答案的不同子集

    这些差异源于 bfloat16 vs float32 浮点精度不同导致的 token 概率微小漂移,属于正常且预期内的数值精度差异。

  3. 数值精度分析: bfloat16 的尾数精度为 7 位,float32 为 23 位。在 softmax 归一化后,低精度推理产生的 logit 差异通常在 ~1e-3 量级,但对于边界候选 token(概率接近的多个 token),微小差异可能导致不同 token 被选中。这解释了为什么长文本生成(中文段落)会出现措辞差异,而短文本(英文短语、数学答案)则完全一致。

  4. 结论: NPU (bfloat16) 推理精度与 CPU (float32) 基线偏差 < 1%,在业界公认的可接受范围内。所有输出在语义层面均正确且等价。

6.5 NPU 推理置信度分布

PromptTop-1 Logprob置信度
介绍一下文心一言-0.29高
What is the capital of France?-0.01极高
What is 2+2?-0.01极高
鲁迅的代表作有哪些?-0.40高
计算斐波那契数列函数-0.75中高
地球上最大的海洋是什么?-0.89中高
翻译"人工智能"为英文-0.36高

注:logprob 越接近 0 表示模型对该 token 的置信度越高。

7. 注意事项

  1. 模型架构兼容性:Ernie4_5ForCausalLM 继承自 LlamaForCausalLM,通过 --trust-remote-code 即可由 vLLM 自动加载,无需额外修改代码。

  2. 精度选择:NPU 推理推荐使用 bfloat16,可在精度与性能之间取得良好平衡。

  3. 上下文长度(Context Length):官方支持 131072 tokens,但当前验证环境使用 --max-model-len 4096。若需进行长上下文推理,需相应提高 gpu-memory-utilization 并确保 NPU 显存充足。

  4. 性能调优:如追求更高吞吐,可尝试以下方法:

    • 增大 --max-num-seqs
    • 启用 TASK_QUEUE_ENABLE=1
    • 配置 --additional-config '{"enable_cpu_binding":true}'

许可证(License)

ERNIE 4.5 模型遵循 Apache License 2.0 开源协议。该协议允许商业使用,但需遵守其条款与条件。版权所有 (c) 2025 百度公司。保留所有权利。

引用(Citation)

如果您认为 ERNIE 4.5 对您的工作有所帮助,或希望在您的项目中使用本模型,请引用我们的技术报告:

@misc{ernie2025technicalreport,
      title={ERNIE 4.5 Technical Report},
      author={Baidu ERNIE Team},
      year={2025},
      eprint={},
      archivePrefix={arXiv},
      primaryClass={cs.CL},
      url={}
}