尧图网络科技YAOTU DIGITAL 获取报价
获取报价
首页 / 资讯中心 / 文章详情

PaddleNLP ERNIE-3.5-SE 实践指南:Parallel Transformer 预训练、SFT/LoRA 精调与动态图预测

发布时间:2026/9/25 3:02:11

资讯中心
01
ARTICLE

PaddleNLP ERNIE-3.5-SE 实践指南:Parallel Transformer 预训练、SFT/LoRA 精调与动态图预测

PaddleNLP ERNIE-3.5-SE 实践指南:Parallel Transformer 预训练、SFT/LoRA 精调与动态图预测
人工智能大模型预训练微调LoRARLHF强化学习分布式训练【免费下载链接】PaddleNLPEasy-to-use and powerful LLM and SLM library with awesome model zoo.项目地址https://gitcode.com/gh_mirrors/pa/PaddleNLP点击查看免费下载ERNIE-3.5-SE 是 PaddleNLP 提供的基于 Parallel TransformerAttention 与 FFN 并行架构的因果语言模型实验项目目录位于 llm/experimental/ernie-3.5-se包含完整的模型实现modeling.py、配置configuration.py、预训练run_pretrain.py、精调finetune_generation.py与预测predict_generation.py脚本。本文将从架构设计出发逐步讲解如何在当前仓库中完成数据准备、启动 3B 模型预训练、执行 SFT/LoRA 精调以及基于动态图完成推理并结合源码说明各关键技术点的底层实现。1. 模型介绍ERNIE-3.5-SE 的三大设计1.1 Parallel TransformerAttention 与 FFN 并行计算传统的 Transformer Decoder 层是先 Attention 后 FFN的串行结构。ERNIE-3.5-SE 采用了 Attention 和 FFN并行的 Parallel Transformer 实现方式将 FFN 与 Attention 层放在同一层内并行计算。这样设计的好处是可以把 Attention 和 FFN 需要的线性层计算进行算子融合降低 kernel 调用以及通讯次数从而提升并行训练的效率。从源码结构看这一设计体现在 modeling.py 中的Ernie35MLPAttention类第 571 行起它把 Q/K/V 投影与 FFN 的 gate/up 投影合并为单个 Column 并行线性层qkv_gate_up_proj输出维度为hidden_size * 3 intermediate_size * 2随后在 forward 中按[head_dim * num_heads * 3, intermediate_size, intermediate_size]切分Attention 分支走 RoPE 注意力计算FFN 分支做F.silu(up) * gate最后把两条分支的输出拼接paddle.concat([ffn_output, attn_output], axis-1)后经过单个 Row 并行线性层o_proj映射回 hidden_size。这一一次线性投影 一次输出投影的结构就是算子融合、减少 kernel 调用与通讯次数的核心来源。在Ernie35DecoderLayer中当parallel_attn_ffnTrue时直接实例化Ernie35MLPAttention当parallel_attn_ffnFalse时则退化为传统串行结构Ernie35AttentionErnie35MLP用于掐头去尾策略下的首尾层。1.2 掐头去尾策略计算量重新分配作者发现第一层的 FFN 和最后一层的 Attention 作用不大因此采用掐头去尾策略去掉首层的 FFN、去掉尾层的 Attention把底层省下的 FFN 计算量挪到模型顶层让 Transformer 层的计算分布更均匀。官方文档指出这一策略在同 FLOPs 下效果与传统 Transformer 结构一致但具有更好的训练速度和吞吐。源码中的实现位置在Ernie35Model.__init__modeling.pyif i 0: # 首层只有 MHA没有 FFN _layer Ernie35DecoderLayer(config, has_ffnFalse, has_mhaTrue, parallel_attn_ffnFalse) elif i (config.num_hidden_layers - 1): # 末层只有 FFN没有 MHA _layer Ernie35DecoderLayer(config, has_ffnTrue, has_mhaFalse, parallel_attn_ffnFalse) else: # 中间层Attention 与 FFN 并行 _layer Ernie35DecoderLayer(config, has_ffnFalse, has_mhaFalse, parallel_attn_ffnTrue)是否启用该结构由配置项parallel_attn_hatfparallel attention head-attention tail-ffn控制。对于 3B 模型该开关为True对应的张量并行切分映射也做了适配Ernie35PretrainedModel._get_tensor_parallel_mappings中为第 0 层的q_proj/k_proj/v_proj/o_proj与最后一层的gate_proj/up_proj/down_proj单独注册了 split/merge 函数见 modeling.py并在 conversion_utils.py 中提供qkv_gate_up_proj_split_fn/merge_fn与o_proj_split_fn/merge_fn处理融合层的权重切分。1.3 Rope Embedding 随机位置编码ERNIE-3.5-SE 使用旋转位置编码 RoPE并且为了获得更好的模型外推能力保留了线性层的 Bias。更重要的是为提供长文外推能力训练时通过随机间隔取 Position Ids让模型具备训短推长的能力。对应源码是 modeling.py 中的RotaryEmbedding类第 267 行起训练阶段self.training且config.enable_random_position_idsTrue以TRAINER_GLOBAL_STEP rank * 100000作为随机种子从max_position_embeddings个位置中无放回随机抽取seq_len个位置并排序作为本步的 position ids实现随机间隔推理阶段当seq_len 4096时times 8否则按max_position_embeddings // seq_len计算间隔通过cumsum构造稀疏递增的 position ids对应解码时使用pos_decoding_interval见下文第 4 节。位置编码在Ernie35Attention.forward中通过rope_attn函数施加到 Q/K 上生成阶段由update_model_kwargs_for_generation中读取环境变量pos_decoding_interval默认 2来递增 position ids。1.4 Sequence Length Warmup渐进序列长度通过动态调整前期训练的序列长度可以提升模型的收敛效率。源码实现为Ernie35ForCausalLM.forward中的progressive_seq函数modeling.pydef progressive_seq(x, y): global_step int(os.getenv(TRAINER_GLOBAL_STEP, 0)) if global_step 500: return x[:, :512], y[:, :512] if global_step 1000: return x[:, :1024], y[:, :1024] if global_step 1500: return x[:, :2048], y[:, :2048] return x, y即全局步数在 500/1000/1500 之前分别只使用 512/1024/2048 的序列长度1500 步之后才使用完整max_seq_length3B 配置下为 4096。该功能由配置项use_progressive_seq_len控制仅在self.training时生效预训练脚本在--continue_training 1时通过use_progressive_seq_lenTrue传入模型从零预训练continue_training0时则从run_pretrain.py的from_config路径构建。2. 模型配置与 Tokenizer2.1 Ernie35Config 关键配置项Ernie35Config定义在 configuration.py其pretrained_init_configuration中内置了两套配置配置项baidu/ernie-3.5-se-3bernie/tiny-random-ernie测试用hidden_size3072768intermediate_size81922048num_hidden_layers323num_attention_heads2412max_position_embeddings3276832k4096parallel_attn_hatfTrueTrueenable_random_position_idsTrueTrueuse_progressive_seq_lenTrueFalsevocab_size3200032000use_biasTrueTrueuse_flash_attentionTrueTruetie_word_embeddingsFalseFalseweight_share_add_biasTrueTrue其他常用开关还包括use_recompute重计算、use_recompute_attn仅 Attention 重计算开启后自动关闭use_recompute、fuse_ln融合 LayerNorm、fuse_linear融合线性层、tensor_parallel_output、ignored_index默认 -100等。所有开关均可作为构造参数传入预训练/精调脚本会根据命令行参数覆盖其中部分字段。2.2 Ernie35TokenizerTokenizer 实现在 tokenizer.py基于 SentencePieceBPE 模型文件位于 ernie-tokenizer/sentencepiece.bpe.model特殊 tokenunk、sbos、/seospadding 使用 unkpadding_sideleft便于 batch 推理模型输入字段[input_ids, attention_mask, position_ids]add_bos_tokenTrue、add_eos_tokenFalsetokenizer_config.json 中可确认目录下的 special_tokens_map.json 一并随 tokenizer 目录加载。精调脚本加载 tokenizer 时会强制padding_sideleft并设置pad_token unk_token。3. 预训练3.1 数据准备预训练数据制作方法参考 llm/tools/preprocess/docs/OpenWebText2.md。为了便于用户快速运行测试仓库提供了处理好的 100k 条 doc 的训练样本OpenWebText2 的 id 序列与索引文件wget https://bj.bcebos.com/paddlenlp/models/transformers/ernie/data/ernie_openwebtext_100k_ids.npy wget https://bj.bcebos.com/paddlenlp/models/transformers/ernie/data/ernie_openwebtext_100k_idx.npz将所有预处理得到的文件统一放入一个文件夹中以备训练使用mkdir data mv ernie_openwebtext_100k_ids.npy ./data mv ernie_openwebtext_100k_idx.npz ./data数据加载逻辑在 ernie_dataset.py 中实现MMapIndexedDataset通过内存映射mmap读取_ids.npy并依据_idx.npz中的lens/docs构建文档指针LLMDataset按seq_length 1滑窗构造训练样本前seq_length个 token 为input_ids后移一位作为labels见run_pretrain.py的_collate_data。索引映射doc-idx/sample-idx/shuffle-idx会缓存到数据目录下的index-cache中且依赖fast_dataindex包的 C helpers 加速构建多数据集混合训练时BlendableDataset支持按权重如1.0>task_nameernie35_hybrid python -u -m paddle.distributed.launch \ --gpus 0,1,2,3,4,5,6,7 \ --log_dir output/$task_name_log \ run_pretrain.py \ --model_type ernie \ --model_name_or_path baidu/ernie-3.5-se-3b \ --tokenizer_name_or_path ernie-tokenizer \ --input_dir ./data \ --output_dir output/$task_name \ --split 949,50,1 \ --max_seq_length 4096 \ --per_device_train_batch_size 1 \ --per_device_eval_batch_size 1 \ --use_flash_attention 1 \ --use_fused_ln 1 \ --bf16 \ --fp16_opt_level O2 \ --scale_loss 512 \ --learning_rate 0.0003 \ --min_learning_rate 0.00003 \ --lr_scheduler_type cosine \ --max_steps 300000 \ --save_steps 200 \ --adam_beta2 0.95 \ --weight_decay 0.1 \ --warmup_steps 2000 \ --max_grad_norm 1.0 \ --logging_steps 2 \ --dataloader_num_workers 0 \ --sharding stage2 \ --sharding_parallel_degree 8 \ --eval_steps 200 \ --report_to visualdl \ --disable_tqdm true \ --continue_training 0 \ --recompute 1 \ --do_train \ --do_eval \ --save_total_limit 10 \ --device gpu注意命令需在llm/experimental/ernie-3.5-se目录下执行run_trainer_stage2.sh中额外设置了PYTHONPATH../../:$PYTHONPATH以便导入上层 PaddleNLP 包。3.3 预训练脚本核心逻辑run_pretrain.py的主流程run_pretrain.py可以拆解为参数解析使用PdArgumentParser解析ModelArguments / DataArguments / PreTrainingArguments三组参数配置构造config.max_position_embeddings max(config.max_position_embeddings, max_seq_length)若非 continue_training 模式把vocab_size向上对齐到 128 的倍数Reset vocab size for better amp performance随后用命令行开关覆盖use_flash_attention、fuse_ln、use_recompute、tensor_parallel_degree/rank等字段精度设置fp16_opt_level O2时按--bf16/--fp16选择bfloat16/float16作为模型加载 dtype学习率调度lr_scheduler_type支持cosineCosineAnnealingWithWarmupDecay与linearLinearAnnealingWithWarmupDecaywarmup_steps 0时直接使用否则用warmup_ratio * max_steps折算decay_steps缺省为max_steps数据管线get_train_data_file自动扫描input_dir下所有_idx.npz前缀文件多文件时按权重 1.0 混合create_pretrained_dataset依据split 949,50,1与max_seq_length构建 train/valid/test 数据集训练器继承paddlenlp.trainer.Trainer的PretrainingTrainer重写了evaluate保留 eval_dataloader 避免重复初始化导致 OOM并使用DistributedBatchSamplershuffleFalse、按 dataset rank 切分作为数据采样器断点续训通过get_last_checkpoint自动检测output_dir中已有 checkpoint配合--resume_from_checkpoint续训。run_trainer_stage2.sh中与上面 README 命令略有差异的参数包括per_device_train_batch_size 2、gradient_accumulation_steps 2、amp_master_grad 0、tensor_parallel_degree 1、pipeline_parallel_degree 1、virtual_pp_degree 1、logging_steps 1、eval_steps 50、recompute 0、save_total_limit 5可按实际显存与硬件调整。3.4 预训练注意事项Paddle 版本需要 paddle develop 版本训练并安装缺失的 whl 包pip install fast_dataindex visualdl2.5.3等FlashAttentionuse_flash_attention需要在 A100 机器开启否则 loss 可能不正常很快变成 0.00x非常小不正常。建议使用 cuda11.8 环境。源码中scaled_dot_product_attention在开启 flash attention 时直接调用paddle.nn.functional.flash_attention此时 attention mask 会被忽略、因果 mask 由causalTrue参数提供continue_training表示从现有的预训练模型权重加载继续训练从头预训练时设置为 0。对应run_pretrain.py中continue_trainingTrue走from_pretrained(...use_progressive_seq_lenTrue)否则走from_configuse_fused_ln需要安装slm/model_zoo/gpt-3/external_ops目录下的自定义 OPpython setup.py install安装后若仍找不到算子需要额外设置PYTHONPATH指向该自定义算子目录。对应 modeling.py 中import fused_ln as fused的FusedLayerNorm实现并行策略当前脚本为Sharding stage2版本。需要 4D 并行训练数据、sharding、张量、流水线并行的用户可另外调整tensor_parallel_degree、pipeline_parallel_degree、virtual_pp_degree、sharding、sharding_parallel_degree等相关参数。另外模型初始化时Ernie35ForCausalLM.__init__会把initializer_range调整为sqrt(0.3333 / hidden_size)bigscience 的 std-init 技巧并在_post_init中按1/sqrt(2 * num_hidden_layers)缩放各输出投影权重以保证深模型训练的稳定性。4. 精调SFT 与 LoRA4.1 SFT全量微调python -m paddle.distributed.launch \ --gpus 0,1,2,3,4,5,6,7 \ finetune_generation.py \ --output_dir output_sft/$task_name \ --per_device_train_batch_size 4 \ --gradient_accumulation_steps 2 \ --per_device_eval_batch_size 8 \ --model_name_or_path PATH_TO_CKPT \ --task_name squad \ --num_train_epochs 2 \ --learning_rate 3e-5 \ --warmup_steps 30 \ --logging_steps 1 \ --evaluation_strategy epoch \ --save_strategy epoch \ --src_length 1024 \ --tgt_length 1024 \ --bf16 \ --fp16_opt_level O2 \ --do_train \ --do_eval \ --disable_tqdm True \ --load_best_model_at_end True \ --metric_for_best_model accuracy \ --eval_with_do_generation False \ --recompute \ --save_total_limit 1 \ --overwrite_output_dir \ --sharding stage2 \ --sharding_parallel_degree 84.2 LoRA参数高效微调python finetune_generation.py \ --output_dir ./checkpoints/ \ --per_device_train_batch_size 4 \ --gradient_accumulation_steps 2 \ --per_device_eval_batch_size 8 \ --model_name_or_path PATH_TO_CKPT \ --task_name squad \ --num_train_epochs 2 \ --learning_rate 3e-4 \ --warmup_steps 30 \ --logging_steps 1 \ --evaluation_strategy epoch \ --save_strategy epoch \ --src_length 1024 \ --tgt_length 1024 \ --bf16 \ --fp16_opt_level O2 \ --do_train \ --do_eval \ --disable_tqdm True \ --load_best_model_at_end True \ --metric_for_best_model accuracy \ --eval_with_do_generation False \ --recompute \ --save_total_limit 1 \ --overwrite_output_dir \ --lora True \ --lora_rank 84.3 精调脚本源码要点finetune_generation.py的参数分为ModelArgument / DataArgument / TrainingArguments三组主流程关键点包括LoRA 目标模块当--lora True且未指定lora_path时默认对q_proj/v_proj/k_proj/gate_proj/up_proj/o_proj/down_proj/qkv_gate_up_proj全部挂 LoRALoRAConfig(rlora_rank, lora_alpha2*lora_rank)并调用model.mark_only_lora_as_trainable()冻结其余参数若指定--lora_path则从已有 LoRA 权重初始化数据集加载支持三种方式——内置数据集--task_name squad加载 SQuAD v1.0 的 train_v1/dev_v1、--data_name--task_name如load_dataset(data_name, task_name)、--dataset_path目录下需含train.json/dev.json格式为{src: [...], tgt: [...]}或 instruction 格式数据转换data.py 的convert_exampleSQuAD 样例被拼为answer: {answer} context: {context}输入与question: {question} /s输出source 部分的 labels 置为IGNORE_INDEX(-100)然后整体右移一位评估eval_with_do_generation为 True 时调用model.generate并计算生成结果与参考答案的指标compute_metrics来自 utils.py否则只计算 losscompute_metrics_not_do_generationmetric_for_best_model accuracy配合load_best_model_at_end选择最优 checkpoint训练结束trainer.save_model(merge_tensor_paralleltraining_args.tensor_parallel_degree 1)即在张量并行场景下自动合并切分权重后保存。4.4 参数释义以下参数同时适用于 SFT 与 LoRAmodel_name_or_path: 预训练模型内置名称或者模型所在目录。num_train_epochs: 要执行的训练 epoch 总数如果不是整数将在停止训练之前执行最后一个 epoch 的小数部分百分比。max_steps: 模型训练步数。learning_rate: 参数更新的学习率。warmup_steps: 学习率热启的步数。eval_steps: 模型评估的间隔步数。logging_steps: 训练日志打印的间隔步数。save_steps: 模型参数保存的间隔步数。save_total_limit: 模型 checkpoint 保存的份数。output_dir: 模型参数保存目录。src_length: 上下文的最大输入长度默认为 128。tgt_length: 生成文本的最大长度默认为 160。gradient_accumulation_steps: 模型参数梯度累积的步数可用于扩大 batch size。实际的 batch_size per_device_train_batch_size * gradient_accumulation_steps。bf16: 使用 bfloat16 精度进行模型训练和推理。fp16_opt_level: bfloat16 精度训练模式O2表示纯 bfloat16 训练。recompute: 使用重计算策略开启后可节省训练显存。do_train: 是否训练模型。do_eval: 是否评估模型。tensor_parallel_degree: 模型并行数量。eval_with_do_generation: 在评估的时候是否调用 model.generate默认为 False。lora: 是否使用 LoRA 技术。merge_weights: 是否合并原始模型和 LoRA 模型的权重。lora_rank: LoRA 算法中 rank秩的值默认为 8。lora_path: LoRA 参数和配置路径对 LoRA 参数进行初始化。task_name: 内置数据集任务名。data_name: 内置数据集名定义数据集名必须同时定义数据集任务名。dataset_path: 自定义数据集路径。5. 动态图预测完成训练后使用 predict_generation.py 进行动态图推理python predict_generation.py \ --model_name_or_path PATH_TO_CKPT \ --tokenizer_name_or_path ernie-tokenizerPredictor的核心逻辑加载Ernie35Tokenizer.from_pretrainedErnie35ForCausalLM.from_pretrained当世界卡数大于 1 时自动初始化 hybrid 通信组并设置tensor_parallel_degreedtype 为 float16/bf16 时自动开启 flash attention推理加速长文本外推当src_length tgt_length 4096时pos_decoding_interval max(max_position_embeddings // (src_length tgt_length), 1)否则取 8随后把输入 position_ids 乘上该间隔并加上interval - 1同时写入环境变量pos_decoding_interval供模型解码时递增 position ids 使用从而用位置间隔放大配合随机位置编码实现训短推长解码默认decode_strategysampling、temperature0.95、top_k3、top_p0.8、repetition_penalty1.0也可通过命令行--top_k/--top_p/--temperature/--batch_size/--src_length/--tgt_length调整低精度模型在paddle.amp.auto_cast(levelO2)下生成输入输出不传--data_file时使用内置 3 条示例文本传--data_file时逐行读取 JSON每行含src字段作为输入结果写入--predict_file默认prediction.json每条输出为{src: ..., output: ...}权重合并传--merge_tensor_parallel_path可在预测完成后调用save_pretrained(merge_tensor_parallelTrue)合并张量并行权重并保存 tokenizer方便单卡部署。6. 结语从 Parallel Transformer 的算子融合、掐头去尾的计算重分配到随机位置编码的长文外推与渐进序列长度训练ERNIE-3.5-SE 在 llm/experimental/ernie-3.5-se 目录内提供了从 configuration.py、modeling.py、ernie_dataset.py 到 run_pretrain.py、finetune_generation.py、predict_generation.py 的完整闭环。读者可按照数据准备 → 预训练 → SFT/LoRA 精调 → 动态图预测的路径在具备 8 卡 A100cuda11.8、paddle develop的环境中复现 3B 模型的完整训练流程也可以仅使用ernie/tiny-random-ernie配置在小规模环境下快速验证管线。赞分享人工智能大模型预训练微调LoRARLHF强化学习分布式训练【免费下载链接】PaddleNLPEasy-to-use and powerful LLM and SLM library with awesome model zoo.项目地址https://gitcode.com/gh_mirrors/pa/PaddleNLP点击查看免费下载相关推荐PaddleNLP ERNIE-3.5-SE 预训练与微调实战指南Parallel Transformer、头部截断尾部移除策略与随机位置编码PaddleNLP ERNIE 3.5 SE 预训练与微调实战指南Parallel Transformer、头部截断尾部移除策略与随机位置编码 本文是一份基于人工智能大模型预训练微调LoRARLHF强化学习分布式训练模型推理服务推理引擎模型量化模型压缩本地部署NLPPaddleNLP Auto Parallel 全流程实战指南从预训练、SFT、LoRA、DPO 到推理PaddleNLP Auto Parallel 全流程实战指南从预训练、SFT、LoRA、DPO 到推理 导读 本文是 PaddleNLP 自动并行Auto人工智能大模型预训练微调LoRARLHF强化学习分布式训练模型推理服务推理引擎模型量化模型压缩本地部署NLPPaddleNLP 大模型训练快速上手SFT 精调与预训练实战指南PaddleNLP 大模型训练快速上手SFT 精调与预训练实战指南 导读 本文面向希望快速开启大模型训练的开发者系统讲解 PaddleNLP 提供的两条主流人工智能大模型预训练微调LoRARLHF强化学习分布式训练模型推理服务推理引擎模型量化模型压缩本地部署NLP上一篇终极yuzu模拟器下载指南轻松获取最新版本实现流畅游戏体验下一篇CANN/ops-nn Sleep控制算子创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
02
RELATED NEWS

相关资讯

更多网站建设与数字化升级内容

03
WHY YAOTU

想打造同款高转化官网?

懂行业、懂生意,从建站到增长一站式陪跑

◈

场景化定制

不做模板站,围绕你的业务场景量身设计,小众不撞款。

◐

营销型架构

以转化目标组织内容与路径,让官网真正带来询盘。

▲

全周期服务

设计、开发、运营、运维一体,上线只是开始。

免费获取你的建站方案

留下需求,专属顾问 24 小时内为你输出方案建议。