Skip to content

Conversation

@lshpku
Copy link

@lshpku lshpku commented Oct 17, 2025

实现正确加载Huggingface Checkpoint功能

由于该模型的 expert_id 是局部的,所以之前用 from_pretrained 无法正确加载 expert 权重,本PR重写了加载逻辑,现在可以正确映射 expert_id 了,21B和300B模型均可使用

10.23新增:支持加载PT版权重,经验证以下两个权重的前10个loss相同:

以后训推同时跑时下载PT版权重即可


使用方法

  1. 下载好相应模型的权重,以ERNIE-4.5-300B-A47B-Base-Paddle为例

  2. 由于下载的权重中的 config.json 是按照推理来的,一些参数甚至会报错,所以需要用本仓库中针对训练的model_configs/ERNIE-4p5-300B-A47B/model_config.json替换掉原有 config.json

  3. 在模型的yaml中,修改以下2个参数

model_name_or_path: /path/to/your/ERNIE-4.5-300B-A47B-Base-Paddle
from_scratch: 0
  1. 为了加快测试速度和避免显存问题,建议也修改以下参数
use_recompute: true  # 最大显存68G
use_fp8_mlp: false        # 加快启动速度,约5min
use_fp8_fuse_node: false  # 同上
gradient_accumulation_steps: 20  # 每step约30s
save_to_hf: false  # 用新版paddleformers时需设置,否则保存的checkpoint无法加载
  1. 然后按照scripts/ERNIE-4p5-300B-A47B/train_96_gpus.sh启动即可

环境建议

  • 使用原版镜像,不要更新 paddle 和 torch,仅更新 transformers==4.55.1 aistudio-sdk==0.3.8 即可
  • paddleformers 建议用 origin/release/v0.2 版本,不要用太新的版本,否则保存的 checkpoint 不兼容,当然如果你不用 checkpoint 转换功能可以不用管
  • 如果报错 vocab_size 不匹配,可以检查下模型的 config.json 中是否为"vocab_size": 103424,本仓库的值可能和模型不一样,以模型的为准

正确性确认

  • 21B首轮loss约2.1,global_grad_norm约20
  • 300B
    • 对齐版本首轮loss约2.2,global_grad_norm约100
    • Base版本首轮loss约1.6,global_grad_norm约30

预训练数据集制作

  1. 下载一个文本数据集,例如 https://modelscope.cn/datasets/BazingaLyn/mini_pretrain_dataset
    格式需为jsonl,每行格式例如BazingaLyn/mini_pretrain_dataset/pretrain_hq_v7.jsonl
{"text": "番茄炒蛋\n材料:\n鸡蛋3个、番茄1个、油、盐、糖、水淀粉\n做法:..."}
{"text": "请描述一下如何正确规划个人理财。正确规划个人理财需要以下几个步骤..."}
{"text": "请输入一段描述有关海洋保护的情景对话。Person A: 哇,这个海滩真..."}
{"text": "鉴别两种不同类型的葡萄酒。鉴别葡萄酒的方法因其类型和品种而异,下..."}
  1. 准备所需代码,首先克隆以下3个代码库:
  1. 打开PaddleNLP/llm/tools/preprocess/create_pretraining_data.py,将import AutoTokenizer一行修改为
# from paddlenlp.transformers import AutoTokenizer
from ernie.tokenizer import Ernie4_5_Tokenizer as AutoTokenizer
  1. 运行,生成数据将会保存在当前目录下的./pretrain_data.bin./pretrain_data.idx
export PYTHONPATH=$PYTHONPATH:$(pwd)/PaddleNLP:$(pwd)/PaddleFormers:$(pwd)/ERNIE
python -u PaddleNLP/llm/tools/preprocess/create_pretraining_data.py \
    --model_name "/path/to/your/ERNIE-4.5-21B-A3B-Base-Paddle" \
    --data_format "JSON" \
    --input_path "/path/to/your/BazingaLyn/mini_pretrain_dataset/pretrain_hq_v7.jsonl" \
    --append_eos \
    --output_prefix "./pretrain_data"  \
    --workers 1 \
    --log_interval 10000 \
    --data_impl "mmap"

@paddle-bot
Copy link

paddle-bot bot commented Oct 17, 2025

Thanks for your contribution!

@lshpku lshpku force-pushed the load-huggingface-ckpt branch 2 times, most recently from bf45b74 to b35dcd9 Compare October 23, 2025 08:24
@lshpku lshpku force-pushed the load-huggingface-ckpt branch from b35dcd9 to c4c77d4 Compare November 19, 2025 11:25
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant