DeepSpeed-Chat 第二步 DPO 微调训练脚本实战:从 OPT-350m 到 Llama-2-7b 的模型替换与参数全解 示例工程【免费下载链接】DeepSpeedExamplesExample models using DeepSpeed项目地址https://gitcode.com/gh_mirrors/de/DeepSpeedExamples点击查看免费下载本指南聚焦 DeepSpeed-Chat 训练流水线第二步——Direct Preference OptimizationDPO偏好对齐微调中training_scripts/目录下的全部训练脚本你将学会如何用一条命令在单卡、单机多卡、多节点场景下启动 DPO 训练如何通过--model_name_or_path一键切换facebook/opt、EleutherAI/gpt-neo、meta-llama/Llama-2等模型家族理解 ZeRO 阶段、CPU 卸载、LoRA、梯度检查点等关键参数的作用并深入 DPO 损失函数的源码实现原理。一、训练脚本目录总览在 applications/DeepSpeed-Chat/training/step2_dpo_finetuning/ 下training_scripts/目录按模型家族与运行规模组织脚本其结构为training_scripts/ ├── llama2/ │ ├── run_llama2_7b.sh # Llama-2-7B 全参数 DPO │ └── run_llama2_7b_lora.sh # Llama-2-7B LoRA 高效 DPO └── opt/ ├── multi_node/ │ └── run_350m.sh # 多节点分布式 ├── single_gpu/ │ └── run_350m.sh # 单 GPU └── single_node/ ├── run_350m.sh # 单机多卡 └── sweep/ ├── run_step2_sweep.sh # 超参扫描入口 ├── run_single.sh # 单次运行封装 └── README.md如 training_scripts/README.md 所述每个文件夹中的 bash 脚本默认都以 facebook/opt 家族为示例。所有脚本最终都调用同一个入口 main.py区别仅在于传入的命令行参数组合因此理解一个脚本即可掌握整套脚本的用法。二、DPO 微调简介为什么训练参数与 Reward Model 微调几乎相同DPODirect Preference Optimization是一种直接偏好学习算法它不再显式训练奖励模型、再用强化学习RLHF 第三步优化策略而是利用奖励模型的特定参数化形式在闭式解中提取对应的最优策略通过一个简单的分类损失让语言模型直接与人类偏好对齐避开了 RLHF 的复杂性与不稳定性。正如 DPO 论文标题所言Your Language Model is Secretly a Reward Model——由于语言模型本身就蕴含奖励建模能力DPO 的训练参数与训练流程绝大部分与 step2 Reward Model (RM) finetuning 相同这也是两个 step 目录脚本结构几乎一致的原因。训练完成后你会得到一个已经与人类偏好对齐的语言模型。这一背景在 step2 DPO README 中有完整说明。三、快速上手OPT-350m 单机训练training_scripts/opt/single_node/run_350m.sh 是官方推荐的入门脚本在 step2 目录下直接执行bash training_scripts/opt/single_node/run_350m.sh脚本接受两个位置参数OUTPUT输出目录默认./output与ZERO_STAGE默认0。脚本核心命令如下deepspeed 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 \ --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要点解读数据--data_path可同时传入多个偏好数据集Dahoas/rm-static、Dahoas/full-hh-rlhf、Dahoas/synthetic-instruct-gptj-pairwise、yitingxie/rlhf-reward-datasets多个数据集会被混合拼接--data_split 2,4,4表示三个训练阶段SFT/RM/PPO按 2:4:4 划分同一份数据DPO 使用其中的 phase 2 部分与 main.py 中train_phase 2的设定 对应。精度与硬件默认 ZeRO Stage 0--zero_stage 0OPT-350m 规模下单机即可训练--dtype默认fp16可切bf16。日志所有输出重定向到$OUTPUT/training.log便于后台观察训练进度。四、切换模型--model_name_or_path 就是唯一开关这是 training_scripts/README.md 的核心指导所有脚本都默认使用facebook/opt-350m想换成其他模型只需替换--model_name_or_path参数。例如把 OPT-350m 换成 EleutherAI 的 GPT-Neo 系列# 原命令 --model_name_or_path facebook/opt-350m # 替换为 --model_name_or_path EleutherAI/gpt-neo-125m由于脚本内部通过 Transformers 的AutoModelForCausalLM与load_hf_tokenizer自动加载模型和分词器见 main.py 中模型创建与分词器加载因此任何 Hugging Face 上的因果语言模型causal LM原则上都可以通过这一个参数接入例如将EleutherAI/gpt-j-6b作为目标模型。关于项目完整支持含 llama2 7B/13B、llama2-70b 等的模型清单请查阅 DeepSpeed-Chat 支持的模型列表即训练脚本 README 中所指 our landing page。更换模型时需要同步考虑两点一是显存规模二是学习率——大模型通常需要更小的学习率见下文 Llama-2 脚本中9.65e-6的取值。五、Llama-2-7B全参数训练与 LoRA 高效微调5.1 全参数训练training_scripts/llama2/run_llama2_7b.sh 展示了 7B 级模型的配置思路默认输出目录为./output_step2_llama_7b_epoch1_lr9.65e-6默认ZERO_STAGE3deepspeed main.py \ --data_path Dahoas/rm-static \ --data_split 2,4,4 \ --model_name_or_path meta-llama/Llama-2-7b-hf \ --per_device_train_batch_size 8 \ --per_device_eval_batch_size 8 \ --max_seq_len 512 \ --learning_rate 9.65e-6 \ --weight_decay 0.1 \ --num_train_epochs 1 \ --gradient_accumulation_steps 1 \ --lr_scheduler_type cosine \ --num_warmup_steps 0 \ --seed 1234 \ --gradient_checkpointing \ --zero_stage $ZERO_STAGE \ --deepspeed \ --offload \ --output_dir $OUTPUT \ $OUTPUT/training.log与 OPT-350m 脚本相比Llama-2 脚本的关键差异--zero_stage 3--offloadZeRO-3 将模型参数、梯度、优化器状态分片到所有 GPU--offload再把优化器状态等卸载到 CPU对应DeepSpeedCPUAdam优化器路径见 main.py 优化器选择使 7B 模型在有限显存下可训练。--gradient_checkpointing以少量计算换取显存进一步降低激活值占用。--learning_rate 9.65e-6远低于 OPT-350m 的5e-5符合大模型 DPO 微调常见做法。5.2 LoRA 高效微调training_scripts/llama2/run_llama2_7b_lora.sh 在上一脚本基础上叠加 LoRA 参数--lora_dim 128 \ --lora_module_name layers. \对应 main.py 的 LoRA 分支当--lora_dim 0时调用convert_linear_layer_to_lora将指定模块范围内的线性层替换为 LoRA 低秩分解结构配合--only_optimize_lora可以只优化 LoRA 参数冻结基座模型配合--lora_learning_rate默认5e-4单独设置 LoRA 学习率。训练结束保存时main.py 会调用convert_lora_to_linear_layer将 LoRA 权重合并回原模型再以标准 HF 格式保存。六、多节点与单卡场景多节点training_scripts/opt/multi_node/run_350m.sh 与单节点脚本参数一致仅将per_device_train_batch_size降到2多卡场景下总 batch 由 world size 放大配合 DeepSpeed 的分布式启动方式运行。单卡training_scripts/opt/single_gpu/run_350m.sh 是最精简的示例通过deepspeed --num_gpus 1 main.py显式限定单 GPU并将--gradient_accumulation_steps提升到4以模拟较大 batch同时开启 TensorBoard 记录deepspeed --num_gpus 1 main.py --model_name_or_path facebook/opt-350m \ --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其中--enable_tensorboard/--tensorboard_path对应 main.py 的 TensorBoard 日志参数默认路径为step2_tensorboard供后续用 TensorBoard 观察损失曲线。七、超参扫描sweep 脚本自动化跑批DPO 脚本还内置了一套超参扫描工具见 training_scripts/opt/single_node/sweep/。其 README.md 说明当前扫描覆盖ZeRO Stage ∈ {2, 3}与Offload ∈ {True, False}共 4 种组合。入口脚本 run_step2_sweep.sh 双层循环生成 4 个组合逐个调用 run_single.shfor z in {2..3} do for offload in true false do cmdbash training_scripts/opt/single_node/sweep/run_single.sh \ ${z} ${offload} z${z}_offload_${offload} $cmd pkill -9 python sleep 60 done done每次跑完一组后脚本会pkill -9 python并休眠 60 秒清理显存run_single.sh则把 ZeRO 阶段与 Offload 开关拼进deepspeed main.py命令Offload 为 true 时追加--offload。该框架可以很容易地扩展扫描维度学习率、weight decay 等只需在run_single.sh中追加参数变量即可。运行扫描只需一条命令在 step2 目录下bash training_scripts/opt/single_node/sweep/run_step2_sweep.sh八、main.py 核心参数全解所有脚本共享 main.py 的parse_args中定义的参数体系下表按功能分组整理关键参数类别参数默认值说明数据--data_pathDahoas/rm-static训练数据路径支持多个数据集混合数据--data_split2,4,4三阶段数据划分比例DPO 取 phase 2数据--data_output_path/tmp/data_files/预处理缓存shuffle index、tokenized .pt 文件存放位置建议放在节点本地存储模型--model_name_or_path必填预训练模型路径或 HF 模型 ID模型--max_seq_len512最大序列长度模型--dropoutNone覆盖模型默认 dropout脚本中常用0.0训练--per_device_train_batch_size16每设备训练 batch训练--per_device_eval_batch_size16每设备评估 batch训练--num_train_epochs1训练轮数训练--gradient_accumulation_steps1梯度累积步数优化--learning_rate1e-3初始学习率OPT 脚本用5e-5Llama-2 用9.65e-6优化--weight_decay0.0权重衰减脚本常用0.1优化--lr_scheduler_typecosine调度器类型linear/cosine/cosine_with_restarts/polynomial/constant/constant_with_warmup优化--num_warmup_steps0预热步数DPO 损失--beta1e-1DPO 损失温度参数典型取值 0.1~0.5beta 趋近 0 时等价于忽略参考模型DPO 损失--label_smoothing0.0标签平滑假设偏好存在噪声以该概率翻转DeepSpeed--zero_stage0ZeRO 优化阶段Actor 模型DeepSpeed--offload关闭启用 ZeRO CPU OffloadDeepSpeed--offload_reference_model关闭为参考模型单独启用 OffloadDeepSpeed--dtypefp16训练精度可选fp16/bf16显存--gradient_checkpointing关闭梯度检查点LoRA--lora_dim0大于 0 时启用 LoRA 高效训练LoRA--lora_module_namedecoder.layers.LoRA 作用模块范围LoRA--only_optimize_lora关闭只优化 LoRA 参数LoRA--lora_learning_rate5e-4LoRA 学习率精度--compute_fp32_loss关闭低精度fp16/bf16下用 fp32 计算损失日志--enable_tensorboard关闭开启 TensorBoard日志--tensorboard_pathstep2_tensorboardTensorBoard 日志目录其他--seed1234随机种子保证可复现其他--local_rank-1分布式训练 local_rank-1 表示单机两个需要展开的 DPO 专属参数其含义直接对应损失函数源码--beta温度参数控制对参考模型未对齐的初始策略偏离的惩罚强度。beta越大模型越不偏离参考模型beta - 0时损失退化为仅最大化 chosen 与 rejected 的对数概率差等价于忽略参考模型。--label_smoothing用于处理偏好标签噪声——假设偏好以该概率被翻转对应损失中logsigmoid(logits) * (1 - label_smoothing)与logsigmoid(-logits) * label_smoothing两项的加权。此外注意main.py会通过deepspeed.add_config_arguments(parser)挂接 DeepSpeed 的通用配置参数因此还可在命令行直接传入--deepspeed_config等标准 DeepSpeed 参数。九、源码层面DPO 损失是如何计算的理解训练脚本背后的计算逻辑能帮助你正确调参。DPO 训练需要同时前向两个模型——被训练的策略模型与冻结的参考模型main.py 中的ref_model构建逻辑 显示参考模型与 Actor 使用同一权重初始化且当zero_stage ! 3时参考模型以 ZeRO-0 加载假设显存足够容纳只有 ZeRO-3 场景才为参考模型复用分片配置并支持--offload_reference_model将参考模型卸载到 CPU。每次训练 step 的核心流程main.py 训练循环DataCollatorReward见 dschat/utils/data/data_utils.py 中的实现将每个样本的 chosen 与 rejected 序列拼接到同一 batchinput_ids前半为 chosen、后半为 rejected对每条样本计算 chosen 与 rejected 首个分叉 token 位置divergence_ind将该位置之前的label_mask置 0只对分歧之后的部分计算对数概率避免 prompt 前缀抵消get_batch_logpsmain.py L219-L229通过torch.gather从 logits 的 log_softmax 中取出每个真实 token 的对数概率并按 label_mask 求和得到序列级对数概率分别对策略模型model与参考模型ref_modeltorch.no_grad()计算chosen_logps、rejected_logps、ref_chosen_logps、ref_rejected_logps按如下公式计算 DPO 损失logits beta * ((chosen_logps - ref_chosen_logps) - (rejected_logps - ref_rejected_logps)) loss -logsigmoid(logits) * (1 - label_smoothing) - logsigmoid(-logits) * label_smoothing其中beta * (logps - ref_logps)正是隐式奖励的估计logsigmoid项则让 chosen 隐式奖励高于 rejected从而驱动策略对齐人类偏好。main.py 注释表明该实现参考了 DPO 开源实现与 Hugging Face TRL 的dpo_trainer。评估阶段main.pyevaluation函数以同样的方式计算验证集损失并额外输出chosen_rewards与rejected_rewards即隐式奖励均值供训练前后对比模型对齐程度。十、数据集格式每个样本一对 chosen / rejected由于 DPO 把语言模型当作奖励模型使用其数据集格式与 Reward Model 微调完全一致见 step2 DPO README 的 Datasets 小节同一输入 prompt 对应两条输出——一条 chosen被人类偏好与一条 rejected被拒绝。训练时模型的目标就是增大 chosen 序列的相对概率、压低 rejected 序列的相对概率。仓库默认使用的Dahoas/rm-static、Dahoas/full-hh-rlhf等开源偏好数据集均符合该格式。十一、训练后评估与模型输出DPO 训练产出的 checkpoint本质上就是一个对齐后的语言模型因此可以像 step1 Supervised Finetuning 那样直接评估如做生成测试、下游任务评测。模型保存逻辑见 main.py 保存部分默认以标准 HF 格式保存save_hf_format而当--zero_stage 3时因每个 GPU 只持有模型分片会额外调用save_zero_three_model完成 ZeRO-3 的权重聚合保存。总结如何选择训练脚本你的场景推荐脚本入门验证 / 单机多卡training_scripts/opt/single_node/run_350m.sh单 GPU 显存受限training_scripts/opt/single_gpu/run_350m.sh配合--gradient_accumulation_steps多节点集群training_scripts/opt/multi_node/run_350m.sh7B 级模型全参数training_scripts/llama2/run_llama2_7b.shZeRO-3 offload7B 级模型显存紧张training_scripts/llama2/run_llama2_7b_lora.shLoRA自动跑多组配置training_scripts/opt/single_node/sweep/run_step2_sweep.sh所有脚本只需修改--model_name_or_path即可切换到其他因果语言模型动手前记得同步评估显存规模并相应调整 ZeRO 阶段、Offload、batch size 与学习率。赞分享示例工程【免费下载链接】DeepSpeedExamplesExample models using DeepSpeed项目地址https://gitcode.com/gh_mirrors/de/DeepSpeedExamples点击查看免费下载相关推荐DeepSpeed-Chat Step 2 奖励模型微调训练脚本实战模型替换、参数全解与打分原理DeepSpeed Chat Step 2 奖励模型微调训练脚本实战模型替换、参数全解与打分原理 本文以 step2_reward_model_finetun示例工程DeepSpeed-Chat 第三阶段 RLHF 微调实战从训练脚本到混合引擎的原理与参数解析DeepSpeed Chat 第三阶段 RLHF 微调实战从训练脚本到混合引擎的原理与参数解析 导读 本文以 DeepSpeedExamples 仓库中 st示例工程ROCm 安装向导中的 GPU Selector 深度解析Instinct / Radeon / Ryzen 显卡与 gfx 架构映射全指南ROCm 安装向导中的 GPU Selector 深度解析Instinct / Radeon / Ryzen 显卡与 gfx 架构映射全指南 本文聚焦 AMD示例工程上一篇Mac美剧播放器终极指南爱美剧客户端的完整使用教程下一篇Tabliss性能优化技巧提升新标签页加载速度的7个方法创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考