[FSDP] optim FSDP save/load - #79724
Conversation
|
|
||
| sharded_state = {} | ||
| for vname, tensor in state_dict.items(): | ||
| base_name, tag = _split_optimizer_state_name(vname) |
There was a problem hiding this comment.
There was a problem hiding this comment.
新提交通过动态收集优化器的 *_acc*_str,但 Adadelta 的 _avg_squared_grad_acc_str 和 _avg_squared_update_acc_str 值本身以 _ 开头;经 .lstrip("_") 后,实际变量名 fuse_params_0__avg_squared_grad_0 会被解析为 base fuse_params_0_,与 fused buffer owner 不一致,仍会触发 NotImplementedError(另一个累积项同样受影响)。因此该 P1 仍未解决,需修正前缀处理并补充 Adadelta(含 master weight)保存/加载测试。
There was a problem hiding this comment.
Adadelta 的前导下划线问题已修复,但当前解析仍未覆盖 Optimizer 的公开 name 参数:_add_accumulator 会把 self._name + "_" 插入变量名(例如 fuse_params_0_opt_moment1_0),而 _split_optimizer_state_name 只按 _<tag>_ 截断,得到 base fuse_params_0_opt,随后在 base_name != owner 处抛出 NotImplementedError。因此合法的 AdamW(..., name="opt") 等 FSDP 续训仍无法保存;建议按 owner 后的完整后缀解析或显式覆盖/拒绝命名优化器,并补充该配置测试。
| opt.step() | ||
| opt.clear_grad() | ||
|
|
||
| opt_sharded_state_dict = fsdp_context.optimizer_sharded_state_dict( |
There was a problem hiding this comment.
Paddle-Bot Review Board (review完成)
| 序号 | 位置 | 优先级 | 规则来源 | 状态 |
|---|---|---|---|---|
| 1 | 优化器状态映射 | 仓库规则:正确性与兼容性 | ✅ | |
| 2 | 检查点往返测试 | 仓库规则:测试质量与验证 | ✅ | |
| 3 | 混合权重衰减策略 | 仓库规则:正确性与兼容性 | ✅ | |
| 4 | Adadelta 混合精度执行 | 仓库规则:功能正确性与兼容性 | ✅ |
Codecov Report❌ Patch coverage is
Additional details and impacted files@@ Coverage Diff @@
## develop #79724 +/- ##
==========================================
Coverage ? 91.81%
==========================================
Files ? 2
Lines ? 171
Branches ? 0
==========================================
Hits ? 157
Misses ? 14
Partials ? 0 ☔ View full report in Codecov by Harness. 🚀 New features to boost your workflow:
|
Failed CI看板
日志分析报告失败的测试 case: 根本原因分析: 5 个失败 job 中,4 个是外部网络或代理故障:Windows 两个 job 和 Linux-DCU 在访问
PR diff 主要修改 FSDP checkpoint、优化器状态和相关测试;快照中没有任何涉及这些改动的编译错误、Python 异常、断言失败、CUDA 错误或测试输出。因此当前证据支持 CI 基础设施/审批状态问题,不支持将失败归因于 PR 代码。 修复建议:
Powered by Nyanpasu with gpt-5.6-luna 默认推理级别, please check the suggestions carefully. |
| "without weight decay; mark the exempt ones with " | ||
| "`param.no_weight_decay = True` before fully_shard()." | ||
| ) | ||
| buffer_decay[buffer_name] = any(answers) and not group.no_decay |
| { | ||
| "test_type": "optimizer", | ||
| "layer_type": "FullyShard", | ||
| "optimizer_type": "Adadelta", |
There was a problem hiding this comment.
新增的 Adadelta 两卡配置会让
test_sharded_state_dict 在真正执行 opt.step() 时失败:上一版 head 47abbded 的 Coverage 日志已稳定复现 Adadelta._append_optimize_op 中 InvalidArgumentError: ... float16 ... float32,而当前 head 仅追加了另一个 AdamW 配置,Adadelta 路径仍未修复。请为 Adadelta 提供有效的 FSDP/混合精度 dtype 处理(或移除/改为受支持的测试配置),并确保该两卡用例可完成训练与 checkpoint 往返。
There was a problem hiding this comment.
已在 head 本地复跑两卡用例:pytest -k TestParallelLayersWith2Devices → 1 passed / 218s,20 个配置全过;单跑 Adadelta 配置 exit 0,save/load 往返断言都执行。
Adadelta 那条没设 amp_level,走默认 O1,MixPrecisionLayer 不 cast 权重(只挂 main_grad hook),param 和 grad 都是 fp32,adadelta_ 无 dtype 冲突。float16 参数只出现在新增的 amp_level=O2 配置,而那条是支持 multi_precision 的 AdamW —— 47abbde 日志里的 float16/float32 应属该配置,误归到 Adadelta 了。
There was a problem hiding this comment.
确认,你的定位正确。我复核到测试基类会复用并修改 os.environ:47abbded 的 O2 配置未显式指定 optimizer_type,因此继承了上一条 Adadelta,实际失败组合是 O2 + Adadelta,而不是默认 O1 的 Adadelta 配置。当前 head 显式设置 AdamW 后已消除该环境串扰;此前归因有误,这条 P1 撤回并标记为已解决。
PR Category
Performance Optimization
PR Types
Others
Description
save/load 方案:
FSDP 将参数拼接为融合 buffer 并按 rank 切分,单卡不持有完整参数。save 时各 rank 直接落盘本地分片,不再 all_gather 参数,记录该分片所属参数及其区间,由 flex_checkpoint 在 load 时重组。
以上为 FC 格式;HF 格式需完整参数,显式 raise 并走离线转换(暂无转换脚本)。
验证:
在 Qwen3-30B-A3B N1C8 上已验证接续对齐。
是否引起精度变化
否