使用DeepSpeed+HuggingFace Trainer训练LLM遇DummyOptim属性错误求助
解决思路
1. 检查训练代码的优化器初始化逻辑
- 不要手动初始化优化器后再传给Trainer,DeepSpeed需要自行接管优化器的创建流程。如果代码里存在
optimizer = AdamW(model.parameters(), lr=...)这类手动初始化代码,直接删除,将Trainer的optimizers参数留空,让DeepSpeed根据配置文件生成优化器。 - 若使用TRL的SFTTrainer,不要手动设置优化器相关参数,让DeepSpeed全权处理即可。
2. 验证DeepSpeed配置文件的正确性
- 配置文件必须包含完整的优化器及调度器配置,示例如下:
{ "optimizer": { "type": "AdamW", "params": { "lr": 2e-5, "betas": [0.9, 0.999], "eps": 1e-8, "weight_decay": 0.01 } }, "scheduler": { "type": "WarmupLR", "params": { "warmup_min_lr": 0, "warmup_max_lr": 2e-5, "warmup_num_steps": 1000 } }, "train_batch_size": 8, "gradient_accumulation_steps": 4, "fp16": { "enabled": true } } - 避免配置冲突,比如不要同时启用
zero_optimization和手动优化器设置,Zero阶段配置需与优化器兼容。
3. 用正确方式启动训练脚本
- 必须通过DeepSpeed专属命令启动训练,示例:
deepspeed --num_gpus=4 train.py --deepspeed ds_config.json - 不能直接用
python train.py启动,否则DeepSpeed无法正确注入优化器等核心组件,导致DummyOptim无法正常工作。
4. 排查TRL与DeepSpeed的兼容性
- 确认trl=0.9.4、deepspeed=0.14.5及对应transformers版本的兼容性。可尝试将TRL升级至最新稳定版,或回退到已知兼容的版本组合。
- 使用SFTTrainer时,初始化阶段不要覆盖
optimizers参数,交给DeepSpeed自动处理。
5. 检查模型加载流程
- 不要手动调用
model.to(device),DeepSpeed会自动处理设备分配。手动移动模型可能破坏优化器的初始化流程。 - 若模型有自定义初始化逻辑,确保不会干扰DeepSpeed的优化器注入流程。
6. 通过DeepSpeed日志排查细节
- 启动训练时添加
--deepspeed_log_level info参数,查看DeepSpeed初始化日志,确认优化器是否被正确创建,是否有错误或警告提示初始化失败的具体原因。
内容的提问来源于stack exchange,提问作者Refinath
相关产品推荐
相关产品推荐

