
示例工程【免费下载链接】DeepSpeedExamplesExample models using DeepSpeed项目地址https://gitcode.com/gh_mirrors/de/DeepSpeedExamples点击查看免费下载本指南围绕 DeepSpeed-Chat 三步 RLHF 训练中 Step1 监督微调SFT阶段的 characterization性能刻画扫描脚本展开逐层拆解run_step1_sweep.sh与run_single.sh的编排逻辑、参数映射规则和底层 DeepSpeed 配置生成原理。读完本文你将掌握如何在单节点上系统扫描 ZeRO Stage2/3、Offload开/关、LoRA开/关共 8 种组合理解 LoRA 分支的特殊超参约定并能自行扩展扫描维度如学习率、weight decay、batch size 等用于训练配置选型。一、背景Step1 SFT 与 characterization 扫描脚本的定位DeepSpeed-Chat 的 RLHF 训练分为三步Step1 监督微调SFT、Step2 奖励模型微调、Step3 RLHF 微调。其中 Step1 SFT 与标准因果语言模型微调高度相似区别在于使用高质量「query-answer」对数据训练模型生成符合人类偏好的回复。在 Step1 目录 下training_scripts/opt/single_node/sweep/子目录提供了一套参数扫描characterization脚本其定位是在固定的模型facebook/opt-1.3b、固定的混合数据集与固定的训练步数下批量穷举关键训练配置帮助用户刻画不同配置对训练过程的影响从而为后续正式训练选择合适配置。当前扫描矩阵覆盖三个维度维度取值ZeRO Stage2, 3OffloadTrue, FalseLoRATrue, False三个维度各取两值共构成2 × 2 × 2 8种组合由脚本串行逐一遍历执行。二、调用链与运行方式整套扫描的入口是 run_step1_sweep.sh调用链为run_step1_sweep.sh → run_single.sh → deepspeed main.py在仓库中从 Step1 目录执行bash training_scripts/opt/single_node/sweep/run_step1_sweep.sh即仓库内的相对路径为applications/DeepSpeed-Chat/training/step1_supervised_finetuning/training_scripts/opt/single_node/sweep/run_step1_sweep.sh运行前需满足以下前置条件已安装deepspeed及 Step1 训练所需的依赖transformers、torch等参考 Step1 requirements 与仓库根目录说明可访问脚本中指定的 4 个 Hugging Face 数据集Dahoas/rm-static、Dahoas/full-hh-rlhf、Dahoas/synthetic-instruct-gptj-pairwise、yitingxie/rlhf-reward-datasets以及facebook/opt-1.3b预训练权重具备至少一块可用的 NVIDIA GPU脚本未做多卡显式设置实际以deepspeed启动时可见的 GPU 数量为准。三、run_step1_sweep.sh三重循环编排器run_step1_sweep.sh 的核心是三层for循环for z in {2..3} do for offload in true false do for lora in true false do cmdbash training_scripts/opt/single_node/sweep/run_single.sh \ ${z} \ ${offload} \ ${lora} \ z${z}_offload_${offload}_lora_${lora} echo ----------------------------- CALLING SHELL SCRIPT ----------------------------- echo $cmd $cmd pkill -9 python sleep 60 echo done done done关键行为组合命名约定每次运行以z${z}_offload_${offload}_lora_${lora}作为输出目录名例如z2_offload_true_lora_true、z3_offload_false_lora_false方便按目录名直接区分 8 次实验串行执行8 个组合按顺序依次执行而非并行避免显存/资源竞争污染结果进程清理与冷却每次训练结束后执行pkill -9 python强制清理可能残留的训练进程随后sleep 60等待 60 秒冷却。从脚本行为可以推断这两步的目的是保证下一次训练在干净的环境下启动避免前一次任务的 GPU 显存、缓存或共享端口残留影响结果注pkill -9 python会无差别终止当前用户环境中的 Python 进程运行前请确认没有其他重要任务。若想扩充扫描维度只需在此脚本中新增一层循环并在调用run_single.sh时追加新参数详见第六节。四、run_single.sh单次训练的参数映射器run_single.sh 接收 4 个位置参数将扫描层的布尔/数值参数翻译成main.py可识别的命令行参数ZERO_STAGE$1 # ZeRO 优化阶段 OFFLOAD$2 # true / false LORA$3 # true / false OUTPUT$4 # 输出目录名默认值兜底ZERO_STAGE为空时默认2OUTPUT为空时默认./output。Offload 映射if [ $OFFLOAD true ]; then OFFLOAD--offload else OFFLOAD fi即true时注入--offload参数false时不注入。LoRA 分支的专属超参这是理解整个扫描的关键配置项LoRAtrueLoRAfalse--lora_dim1280不启用 LoRA--lora_module_namedecoder.layers.空不注入--only_optimize_lora注入不注入--learning_rate1e-39.65e-6--weight_decay0.10.脚本开头注释明确提示「通常 LoRA 需要使用更大的学习率」。这与 Step1 README 中的说明一致——LoRA 只优化少量低秩参数需要更高的学习率才能收敛因此非 LoRA 分支使用9.65e-6的常规微调学习率LoRA 分支则提升到1e-3。完整训练命令拼接后交由deepspeed执行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-1.3b \ --per_device_train_batch_size 8 \ --per_device_eval_batch_size 8 \ --max_seq_len 512 \ --learning_rate ${LEARNING_RATE} \ --weight_decay ${WEIGHT_DECAY} \ --num_train_epochs 16 \ --gradient_accumulation_steps 1 \ --lr_scheduler_type cosine \ --num_warmup_steps 0 \ --seed 1234 \ --zero_stage $ZERO_STAGE \ --deepspeed \ --output_dir $OUTPUT \ $OFFLOAD $LORA_DIM $LORA_MODULE_NAME \ $ONLY_OPTIMIZE_LORA脚本会先mkdir -p $OUTPUT创建输出目录并将该命令的完整输出重定向到$OUTPUT/${OUTPUT}.log即 8 次实验各有一份独立日志。各核心参数的语义对应 main.py 中的parse_args--data_path可接受多个数据集路径本脚本固定使用 4 个开源 RLHF 数据集混合--data_split 2,4,4按 InstructGPT 思路将数据切分为 Step1/Step2/Step3 三份此处表示 20% 用于 SFT、40% 用于奖励模型、40% 用于 RLHF如需只用 SFT可改为10,0,0--model_name_or_path facebook/opt-1.3b基座模型仓库示例以 Meta OPT 系列为主也可替换为 GPT-Neo、Bloom 等--per_device_train_batch_size / --per_device_eval_batch_size 8单设备训练/评估 batch size--max_seq_len 512最大序列长度--num_train_epochs 16训练轮数。Step1 README 特别指出从 InstructGPT 经验看训练更长过拟合倾向对较小模型如 OPT-1.3B生成更符合人类偏好的回答更有帮助--lr_scheduler_type cosine余弦学习率调度main.py中可选linear、cosine、cosine_with_restarts、polynomial、constant、constant_with_warmup--seed 1234固定随机种子保证可复现--zero_stageDeepSpeed ZeRO 优化阶段来自扫描层传入的z--deepspeed启用 DeepSpeed 运行时。五、main.py 中的 DeepSpeed 配置生成扫描参数如何落到 ZeRO 配置run_single.sh只是参数翻译层真正决定 ZeRO Stage、Offload 语义的是 main.py 调用get_train_ds_config生成的 DeepSpeed 配置ds_config get_train_ds_config(offloadargs.offload, dtypeargs.dtype, stageargs.zero_stage, enable_tensorboardargs.enable_tensorboard, tb_pathargs.tensorboard_path, tb_namestep1_model)get_train_ds_config实现在 dschat/utils/ds_utils.py其核心是zero_opt_dictzero_opt_dict { stage: stage, overlap_comm: True, offload_param: {device: device}, offload_optimizer: {device: device}, stage3_param_persistence_threshold: 1e4, stage3_max_live_parameters: 3e7, stage3_prefetch_bucket_size: 3e7, memory_efficient_linear: False }其中device cpu if offload else none——这正是扫描脚本中 Offload 开关的直接落点开启时把参数与优化器状态卸载到 CPU 内存关闭时设备为none留在 GPU。stage3_*系列参数仅在 ZeRO Stage 3 下生效用于控制参数持久化阈值、最大常驻参数量与预取桶大小。混合精度方面dtype默认fp16启用fp16loss_scale_window: 100也可切换bf16。训练批量的实际规模在main.py中按下式重算并覆盖默认值ds_config[train_batch_size] args.per_device_train_batch_size * torch.distributed.get_world_size() * args.gradient_accumulation_steps即「单设备 batch × GPU 数 × 梯度累积步数」。脚本中gradient_accumulation_steps1因此全局 batch 8 × GPU 数。LoRA 在代码层的启用路径当--lora_dim 128 0时main.py依次调用 dschat/utils/module/lora.py 中的convert_linear_layer_to_lora(model, decoder.layers., 128)将模块名包含decoder.layers.的nn.Linear替换为LinearLayer_LoRA内含低秩右/左权重lora_right_weight、lora_left_weight原始权重requires_gradFalseonly_optimize_lora_parameters(model)冻结除 LoRA 参数外的全部参数训练结束后convert_lora_to_linear_layer(model)将 LoRA 权重融合回原线性层再保存。此外若--zero_stage 3main.py会调用save_zero_three_model走 ZeRO-3 的分布式切片模型保存流程每卡只持有部分参数需特殊聚合。六、扩展扫描维度从 8 组合到任意参数网格原文档明确指出「run_step1_sweep.sh 将配置参数传递给 run_single.sh可以扩展扫描超出上述参数例如学习率、weight decay 等」。扩展方式分两步第一步扩展run_single.sh新增位置参数或环境变量例如LEARNING_RATE$5 # 可覆盖内置的 9.65e-6 / 1e-3并在拼接deepspeed main.py命令时将--learning_rate ${LEARNING_RATE}改为使用新传入值。第二步扩展run_step1_sweep.sh新增一层循环并在调用处追加参数例如for lr in 5e-6 1e-5 5e-5 do cmdbash training_scripts/opt/single_node/sweep/run_single.sh \ ${z} ${offload} ${lora} z${z}_offload_${offload}_lora_${lora}_lr_${lr} ${lr} $cmd done可按同样思路扩展--per_device_train_batch_size、--max_seq_len、--num_train_epochs、--dtypefp16/bf16、--gradient_checkpointing注意Step1 README 提示 LoRA 与梯度检查点同时开启且配合--only_optimize_lora会影响 PyTorch autograd 梯度流、--data_path数据集组合等。需要提醒的是扫描层数是乘法关系每加一个维度实验数都会成倍增长务必先以少量 epoch 验证脚本链路再放大网格。七、输出、日志与结果利用每次扫描运行会产生独立输出目录与日志目录z${z}_offload_${offload}_lora_${lora}相对run_single.sh执行位置默认当前目录训练日志${OUTPUT}/${OUTPUT}.log包含完整 DeepSpeed 命令回显与训练过程输出模型检查点训练结束后main.py会保存 HF 格式模型save_hf_format到--output_dirZeRO-3 时另走save_zero_three_model特殊保存路径。对比 8 组实验时可关注三类信号收敛曲线各组合日志中的 loss 变化与每轮评估的 perplexitymain.py每轮打印ppl与eval_loss训练吞吐main.py每步调用 dschat/utils/perf.py 的print_throughput打印吞吐数据显存/资源表现由 ZeRO Stage 与 Offload 决定——ZeRO-2 不开 Offload 显存占用最高、速度最快ZeRO-3 Offload 组合可训练更大模型但速度下降。这与 Step1 README 给出的经验估算一致不开 Offload、启用 ZeRO-3 梯度检查点 LoRA 时可训练模型参数量十亿≈ 总 GPU 显存GB÷ 3。作为对照仓库还提供了非扫描版的单次训练脚本 run_1.3b.shZeRO-2、全参微调、学习率 9.65e-6、开启 TensorBoard与 run_1.3b_lora.shZeRO-0、LoRA、学习率 1e-3其超参与run_single.sh的两个分支一一对应可作为理解扫描结果的基准参照。八、使用注意事项必须在 Step1 目录下运行脚本内以相对路径training_scripts/opt/single_node/sweep/run_single.sh和main.py引用文件需先cd到applications/DeepSpeed-Chat/training/step1_supervised_finetuning再执行8 组合串行且耗时每次训练 16 个 epoch建议先用小 epoch 验证或直接修改run_single.sh中的轮数再启动完整扫描进程清理的副作用pkill -9 python会终止环境中的所有 Python 进程多用户共享机器上需谨慎数据与模型需联网获取4 个数据集与facebook/opt-1.3b来自 Hugging Face离线环境需提前缓存超参未精细调优如 Step1 README 所述脚本内置超参未经大规模调参用户应基于扫描结果自行寻找最优配置。赞分享示例工程【免费下载链接】DeepSpeedExamplesExample models using DeepSpeed项目地址https://gitcode.com/gh_mirrors/de/DeepSpeedExamples点击查看免费下载相关推荐如何快速下载电子课本 PDFtchMaterial-parser 使用教程如何快速下载电子课本 PDFtchMaterial parser 使用教程 tchMaterial parser 是一款免费的电子课本 PDF 下载工具能把示例工程DeepSpeed-Chat DPO 微调超参数扫描指南基于 ZeRO Stage 与 Offload 的自动化特性测试脚本DeepSpeed Chat DPO 微调超参数扫描指南基于 ZeRO Stage 与 Offload 的自动化特性测试脚本 导读 本文讲解 DeepSpee示例工程self-llm 实战MiniMax-M3 BF16 8 卡 DeepSpeed ZeRO-3 CPU Offload LoRA 微调与 SwanLab 可视化self llm 实战MiniMax M3 BF16 8 卡 DeepSpeed ZeRO 3 CPU Offload LoRA 微调与 SwanLab 可视大模型人工智能教程本地部署微调上一篇IntelliJ Community PolySymbols 测试框架实战PolySymbolsTestCase 类层级、Symbol-API 断言速查与逐功能测试食谱下一篇epic-stack 内部命令令牌的自动生成基于 Dockerfile 与 Fly 环境变量的安全实践创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考