已开启
【需求】PyTorch 分支支持 dx/dw 分离场景的重计算和重算预取 #186
DavidFFFan创建于 6月4日
6月4日 添加了label:feature
6月4日 修改标题为 “【需求】PyTorch 分支支持 dx/dw 分离场景的重计算和重算预取”,原标题为“【需求】PyTorch 分支支持 dx/dw 分离场景下 checkpoint 重算结果复用”
6月4日 修改标题为 “【需求】PyTorch 分支支持 dx/dw 分离场景的重计算和重算预取”,原标题为“【需求】PyTorch 分支支持 dx/dw 分离场景下 checkpoint 重算结果复用”
6月4日 修改了issue 的描述
6月16日 关联了pull request:feat(torch): add recompute session for dx/dw split and prefetch support
6月16日 关联了pull request:feat(torch): add recompute session for dx/dw split and prefetch support
背景
当前 HyperParallel PyTorch 分支还不支持 dx/dw 分离场景下的重计算调度,也缺少重算预取能力。在 pipeline F&B fusion、Interleaved 1F1B、fully_shard/HSDP 等场景中,dx 和 dw 可能被拆成独立 backward 阶段或独立调度单元。如果每个阶段各自触发 checkpoint recompute,会导致同一段 activation 被重复重算,影响性能;如果希望提前调度 recompute,也缺少可收集、可手动触发的 recompute handle。
因此需要在 PyTorch 分支补齐 dx/dw 分离场景的重计算支持,并支持重算预取,使上层 scheduler 可以控制 recompute 的触发时机和缓存生命周期。
需求目标
支持 dx/dw 分离场景的重计算
支持重算预取
支持缓存生命周期管理
retain_on_unpack或等价机制:第一次 consumer 读取 recomputed activation 后可选择保留,供后续 dw/consumer 继续使用。PyTorch 现状说明
PyTorch 原生
torch.utils.checkpoint已有GraphExecGroup,可以让同一 group 下的 checkpoint region 在多次 backward 中按同一个 gid 记录重算状态;但原生实现会在每个 saved activationunpack后立即清掉 holder handle,并要求同一GraphExecGroup下的多次 backward 不能访问同一个 saved activation。因此,PyTorch 原生能力不能直接满足 dx/dw 分离共享同一份 recompute activation,也不能提供 HyperParallel scheduler 所需的重算预取 handle。
实现建议
优先在 HyperParallel PyTorch 平台层封装/扩展,形成可由 scheduler 使用的 recompute session 与 prefetch API:
hyper_parallel/platform/torch/activation_checkpoint/或hyper_parallel/core/activation_checkpoint/。_CheckpointFrame、_checkpoint_hook、_recomputation_hook设计。GraphExecGroup的 gid 思路,但需要补齐 dx/dw 共享所需的 retain/clear 语义。验收标准
关联