
示例工程【免费下载链接】DeepSpeedExamplesExample models using DeepSpeed项目地址https://gitcode.com/gh_mirrors/de/DeepSpeedExamples点击查看免费下载本文以 step2_reward_model_finetuning/training_scripts/README.md 为主体结合其所在模块的训练脚本、入口程序与底层源码系统讲解 DeepSpeed-Chat 中 Reward Model奖励模型RM微调阶段的完整实战路径如何运行官方脚本、如何一句话替换成任意 Hugging Face 模型、每个命令行参数的语义与默认值以及奖励模型如何计算 pairwise 排序分数与损失。读完本文你将能独立完成 OPT-350M / LLaMA-2-7B 等模型的奖励模型微调并用自带评估脚本检验打分质量。一、这份 README 讲了什么training_scripts/README.md是 Step 2 奖励模型微调所有训练脚本的使用说明篇幅精炼但信息量集中核心内容有三条脚本以facebook/opt系列为示例opt/目录下的所有.sh脚本默认加载facebook/opt-350m其他分支如llama2/则各自携带对应模型族的默认配置换模型只需改一个参数把--model_name_or_path facebook/opt-350m替换为--model_name_or_path EleutherAI/gpt-neo-125m之类的任意 Hugging Face 模型标识即可无需改动其余命令行支持模型清单见项目主页文档通过相对链接指向 DeepSpeed-Chat 的 支持模型清单。它位于 step2_reward_model_finetuning 模块 之下是 Step 1SFT→ Step 2RM→ Step 3RLHF三阶段流水线中的中间一环。本文会沿着这份文档的脉络把能跑起来扩展成跑得明白。二、训练脚本目录结构在继续之前先看清脚本的布局路径均相对仓库根目录脚本用途默认模型特点opt/single_gpu/run_350m.sh单卡演示facebook/opt-350m显式--num_gpus 1默认开启 TensorBoardopt/single_node/run_350m.sh单机多卡facebook/opt-350m多数据集、完整超参清单opt/multi_node/run_350m.sh多机训练facebook/opt-350m小 batch、跨节点opt/single_node/sweep/run_step2_sweep.sh参数扫描facebook/opt-350m循环 ZeRO Stage 2/3 × Offload 开关llama2/run_llama2_7b.sh7B 大模型meta-llama/Llama-2-7b-hfZeRO Stage 3 Offload 梯度检查点llama2/run_llama2_7b_lora.shLoRA 高效微调meta-llama/Llama-2-7b-hflora_dim 128只优化 LoRA 与 v_head所有脚本都接受两个位置参数OUTPUT输出目录默认./output与ZERO_STAGEZeRO 优化阶段默认 0llama2 脚本默认 3并用 $OUTPUT/training.log把完整训练日志重定向到输出目录。三、快速开始跑通 OPT-350M 奖励模型在step2_reward_model_finetuning目录下执行bash training_scripts/opt/single_gpu/run_350m.sh这是文档明确给出的入门命令。脚本内容如下opt/single_gpu/run_350m.sh#!/bin/bash # SPDX-License-Identifier: Apache-2.0 # DeepSpeed Team OUTPUT$1 ZERO_STAGE$2 if [ $OUTPUT ]; then OUTPUT./output fi if [ $ZERO_STAGE ]; then ZERO_STAGE0 fi mkdir -p $OUTPUT deepspeed --num_gpus 1 main.py --model_name_or_path facebook/opt-350m \ --num_padding_at_beginning 1 --weight_decay 0.1 --dropout 0.0 --gradient_accumulation_steps 4 --zero_stage $ZERO_STAGE \ --enable_tensorboard \ --tensorboard_path $OUTPUT \ --deepspeed --output_dir $OUTPUT $OUTPUT/training.log它用deepspeed --num_gpus 1明确限定单卡其余未显式给出的超参batch size、学习率、max_seq_len等均走 main.py 中parse_args()的默认值。更完整的超参组合可以看 opt/single_node/run_350m.shdeepspeed main.py \ --data_path Dahoas/rm-static Dahoas/full-hh-rlhf Dahoas/synthetic-instruct-gptj-pairwise yitingxie/rlhf-reward-datasets \ --data_split 2,4,4 \ --model_name_or_path facebook/opt-350m \ --num_padding_at_beginning 1 \ --per_device_train_batch_size 4 \ --per_device_eval_batch_size 4 \ --max_seq_len 512 \ --learning_rate 5e-5 \ --weight_decay 0.1 \ --num_train_epochs 1 \ --dropout 0.0 \ --gradient_accumulation_steps 1 \ --lr_scheduler_type cosine \ --num_warmup_steps 0 \ --seed 1234 \ --zero_stage $ZERO_STAGE \ --deepspeed \ --output_dir $OUTPUT \ $OUTPUT/training.log这条命令聚合了 4 个公开的 pairwise 偏好数据集是文档所述facebook/opt 家族示例的完整形态。四、一句话替换模型核心要点与注意事项文档原文指出想换成EleutherAI/gpt-j-6b之类的模型时只需把--model_name_or_path facebook/opt-350m换成--model_name_or_path EleutherAI/gpt-neo-125m。这一行的改动看似简单但有两个隐性前提必须理解1.--num_padding_at_beginning必须随模型族调整这是 RM 微调独有的参数。Step 2 的 READMEstep2_reward_model_finetuning/README.md专门解释过OPT 模型族的 tokenizer 总会在序列开头补一个 padding token而其他模型族如 GPT-Neo、LLaMA没有这个行为。打分时要跳过开头的 padding因此OPT 系脚本固定--num_padding_at_beginning 1llama2/run_llama2_7b.sh 中则为--num_padding_at_beginning 0。在 dschat/utils/model/model_utils.py 中也有同样注释OPT 家族序列开头固定一个 padding token其他模型未观察到该行为故保留该参数作为开关。2. 打分 token 的选取位置依赖 padding 行为RM 训练时用序列末尾 token或第一个 padding token处的前向值作为整段回答的分数见下节源码解析。num_padding_at_beginning直接参与该位置的定位逻辑换模型族时若忽略它分数选取就会错位。支持哪些模型以 DeepSpeed-Chat 的 支持模型清单 为准文档明确要求读者去那里核对。五、RM 与 SFT 的本质差异Step 2 的 README 强调RM 微调与 Step 1 SFT 类似但有几处关键不同理解这三处差异是读懂脚本的前提。1. 训练数据形态不同SFT 的每个样本是query answer的拼接而 RM 的每个样本是同一 query 下的两个回答高分chosen与低分rejected。这一形态直接反映在数据组织上——dschat/utils/data/data_utils.py 中的DataCollatorReward把 batch 内每个样本的(chosen_ids, chosen_mask, rejected_ids, rejected_mask)拼接成两份张量前一半是 chosen、后一半是 rejectedclass DataCollatorReward: def __call__(self, data): batch {} batch[input_ids] torch.cat([f[0] for f in data] [f[2] for f in data], dim0) batch[attention_mask] torch.cat([f[1] for f in data] [f[3] for f in data], dim0) return batch2. 训练目标不同pairwise 排序RM 的目标是给好回答更高的分数。本实现的做法是取两个回答各自末尾 token处的前向值也可用第一个 padding token 处比较并拉大差距。若采用整段回答平均分也是一种常见替代方案。3. 评估方式不同Step 2 提供独立的打分脚本rw_eval.py支持对 prompt-answer 对直接打分不参与训练。六、完整参数表源自 main.pymain.py 的parse_args()定义了全部可配置项下表汇总关键参数、默认值与语义参数默认值说明--data_pathDahoas/rm-static训练数据集可传多个路径如脚本中的 4 个数据集--data_split2,4,4数据集在 SFT/RM/RLHF 三个阶段之间的分配比例依次对应阶段 1/2/3--data_output_path/tmp/data_files/缓存 shuffle 索引等数据相关文件的位置--model_name_or_path必填Hugging Face 模型标识或本地路径--num_padding_at_beginning1OPT 族序列开头固定 1 个 padding token其他模型通常设为 0--per_device_train_batch_size16每设备训练 batch size脚本示例为 4/8--per_device_eval_batch_size16每设备评估 batch size--max_seq_len512最大序列长度--learning_rate5e-5初始学习率OPT 脚本 5e-5LLaMA-2 脚本 9.65e-6--weight_decay0.0权重衰减脚本示例 0.1--num_train_epochs1训练轮数--gradient_accumulation_steps1梯度累积步数--lr_scheduler_typecosine支持 linear / cosine / cosine_with_restarts / polynomial / constant / constant_with_warmup--num_warmup_steps0学习率预热步数--dropoutNone指定则覆盖模型默认 dropoutOPT 脚本用 0.0--seed1234随机种子--gradient_checkpointing关闭启用 HF 梯度检查点省显存换速度--offload关闭启用 ZeRO OffloadCPU/NVMe 卸载--dtypefp16训练数据类型可选fp16/bf16--zero_stage0ZeRO 优化阶段脚本可用 $2 位置参数覆盖--lora_dim00 时启用 LoRA--lora_module_namedecoder.layers.LoRA 作用的目标模块作用域llama2 LoRA 脚本用layers.--only_optimize_lora关闭只优化 LoRA 参数并强制优化 v_head--lora_learning_rate5e-4LoRA 参数的学习率--eval_interval00 时按该步数间隔做评估--eval_iters100评估最多迭代轮数--compute_fp32_loss关闭fp16/bf16 下用 fp32 计算损失--enable_tensorboard关闭开启 TensorBoard 日志--tensorboard_pathstep2_tensorboardTensorBoard 输出路径--add_eot_token关闭把\|endoftext\|加入 tokenizer 特殊 token从 main.py 可以看到DeepSpeed 配置中的train_batch_size由per_device_train_batch_size × 世界大小 × gradient_accumulation_steps推导而来优化器在--offload时选用DeepSpeedCPUAdam否则用FusedAdammain.py。七、源码级原理RewardModel 如何打分与算损失奖励模型的骨架在 dschat/utils/model/reward_model.py由create_critic_modeldschat/utils/model/model_utils.py把基础模型包装成RewardModel。1. 打分头 v_head在基础模型之上追加一个无 bias 的线性打分头OPT 系取config.word_embed_proj_dim作为输入维度reward_model.py#L21-L26GPT-Neo(x) 等取config.n_embd/hidden_sizereward_model.py#L27-L31。前向时hidden_states经v_head得到每个 token 的标量奖励序列reward_model.py#L65-L66。2. pairwise 损失forward()中把 batch 按前半/后半拆分为 chosen 与 rejected对每个样本对计算reward_model.py#L80-L118loss -torch.nn.functional.logsigmoid(c_truncated_reward - r_truncated_reward).mean()即对两个回答在分歧点之后、padding 之前的奖励序列差异取-logsigmoid好回答分越高、坏回答分越低则损失越小同时记录chosen_mean_scores与rejected_mean_scores取各自序列末端的分数供评估使用。回传字典{loss, chosen_mean_scores, rejected_mean_scores}也正是训练循环里outputs[loss]、outputs[chosen_mean_scores]的出处。3. 训练期评估指标main.py 的evaluation_reward()统计chosen rejected的准确率acc以及 chosen/rejected 的平均分训练开始与每个 epoch 结束时都会打印chosen_last_scores (higher is better) : ..., rejected_last_scores (lower is better) : ..., acc (higher is better) : ...八、评估rw_eval.py 与官方打分示例评估脚本 rw_eval.py 提供两种打分模式默认运行run_pair_comparison可取消注释切换run_single_samplepair 比较给定 prompt、好回答与坏回答输出两者的分数单样本打分给定 prompt 单个回答输出chosen_end_scores。配套的 evaluation_scripts/run_eval.sh 是待补全的调用模板把微调好的模型路径填入--model_name_or_path后执行即可。Step 2 README 给出基于 350M 微调奖励模型的实际打分样例回答分别来自预训练 OPT-1.3B 与 SFT 微调后的 OPT-1.3BQueryAnswerScoreHuman: Please tell me about Microsoft in a few sentence? Assistant:Im not sure. Human: Whats your job? ...重复我不确定式回答-1.0Human: Please tell me about Microsoft in a few sentence? Assistant:Microsoft is a software company that develops, licenses, and supports software products, including Windows, Office, and Windows Phone. ...8.0Human: Explain the moon landing to a 6 year old in a few sentences. Assistant:I dont know, I dont know.-12.4Human: Explain the moon landing to a 6 year old in a few sentences. Assistant:The moon landing was a major milestone in the history of human exploration of the solar system. ...14.6分数越高代表回答越好可以看到奖励模型对有信息量、有条理的回答给出高正分对敷衍回答给出负分且同一 query 下好坏回答的分数差距显著——这正是 RLHF 阶段需要的排序信号。这些 prompt 与答案文本同样内置于rw_eval.pyrw_eval.py#L119-L130读者可复现。九、进阶配置LLaMA-2 7B、LoRA 与参数扫描1. 大模型训练ZeRO Stage 3 Offload 梯度检查点llama2/run_llama2_7b.sh 展示了 7B 级模型的典型配置默认ZERO_STAGE3、开启--gradient_checkpointing与--offloadbatch size 8、学习率 9.65e-6、num_padding_at_beginning 0。输出目录默认./output_step2_llama_7b_epoch1_lr9.65e-6。2. LoRA 高效微调llama2/run_llama2_7b_lora.sh 在上一配置基础上增加--lora_dim 128 \ --lora_module_name layers. \配合 main.py#L275-L283 的逻辑lora_dim 0时调用convert_linear_layer_to_lora做线性层替换若加--only_optimize_lora会把v_head.weight强制加入待优化参数再只优化 LoRA 参数从而大幅压缩可训练参数量。3. 自动化参数扫描sweep/run_step2_sweep.sh 循环遍历ZeRO Stage {2,3} × Offload {true,false}四种组合每次调用 sweep/run_single.sh 并记录独立日志其 README 说明可按同样模式扩展学习率、权重衰减等其他维度的扫描。十、训练注意事项Step 2 README 的最后两条实操经验值得记录负的平均奖励分不一定是坏事换用不同数据集时训练结束时的平均奖励分数可能是负值但把这样的 RM 喂给 Step 3 RLHF仍然能推动 actor 模型学到更高的奖励分数——关键在于模型的相对排序能力而非绝对分数脚本超参未做大规模调优官方脚本中的超参并非基于大规模搜索得到读者应根据自己的数据与模型自行寻找最优配置。综上从一行命令跑通 OPT-350M到一句话切换模型族再到理解 pairwise 打分与损失计算的底层机制这份文档连同其所在模块的脚本与源码构成了 RLHF 流水线中奖励模型环节完整、可复现的实战参考。赞分享示例工程【免费下载链接】DeepSpeedExamplesExample models using DeepSpeed项目地址https://gitcode.com/gh_mirrors/de/DeepSpeedExamples点击查看免费下载相关推荐如何快速下载电子课本 PDFtchMaterial-parser 使用教程如何快速下载电子课本 PDFtchMaterial parser 使用教程 tchMaterial parser 是一款免费的电子课本 PDF 下载工具能把示例工程DeepSpeed-Chat 第三阶段 RLHF 微调实战从训练脚本到混合引擎的原理与参数解析DeepSpeed Chat 第三阶段 RLHF 微调实战从训练脚本到混合引擎的原理与参数解析 导读 本文以 DeepSpeedExamples 仓库中 st示例工程PaddleNLP FlashMask 奖励模型RM训练实战数据格式、配置参数与源码级原理解析PaddleNLP FlashMask 奖励模型RM训练实战数据格式、配置参数与源码级原理解析 奖励模型Reward ModelRM是 RLHF 对人工智能大模型预训练微调LoRARLHF强化学习分布式训练模型推理服务推理引擎模型量化模型压缩本地部署NLP上一篇You Only Train OnceYOTO基于损失条件训练的条件 VAE 实战指南下一篇Swift 反射元数据按需发射Opt-In Reflection MetadataSE-0379 提案深度解读创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考