这类问题我又碰上了一次。切到 ZeRO-3 后训练报错,提示参数在 forward 之前没有完成分区初始化,或访问到空张量。
第一反应是「配置文件里 stage 设为 3 但 offload 参数冲突」,验证下来不成立。
排查方向其实有限,先把可能性排一排。没有调用 zero_init 相关的初始化上下文;自定义模型在构造时直接访问了参数的值;多个优化器实例各自持有参数引用。
动手时先在配置文件里开启分区初始化
{"zero_optimization":{"stage":3,"stage3_init_max_live_parameters":1e9}}
代码里用官方上下文包住模型构造
with deepspeed.zero.Init(config=ds_config): model = build_model()
避免在构造阶段读取参数数值
python -c "print('defer parameter access until forward')"
等前面都确认过,再用最小配置先跑通一次前向
deepspeed --num_gpus 2 train.py --deepspeed ds_config.json
怎么算真的好了,看的是同一批现象。训练能进入正常迭代,日志里显示各 rank 的参数量分片情况,loss 开始下降。
这里还有个坑。ZeRO-3 下参数是分片存放的,任何在 forward 之前取值的操作都可能拿到空张量,自定义层里尤其要注意。拖得越久,排查成本越高,因为现场状态会被后续操作覆盖。