用途
PyTorch FSDP(Fully Sharded Data Parallel)技能面向使用 PyTorch 进行大规模分布式训练的开发者,提供基于官方文档的专家级指导。其核心覆盖参数分片(parameter sharding)、混合精度(mixed precision)、CPU offloading 以及 FSDP2 等主题。当需要了解 FSDP 的功能或 API、实现 FSDP 训练方案、调试相关代码或学习最佳实践时,可触发该技能。
主要能力
资料中明确列出的内容包括:
- FSDP 相关主题:参数分片、混合精度、CPU offloading、FSDP2。
- 通用 Join 上下文管理器:用于在不均匀输入(uneven inputs)下进行分布式训练,涉及
Join、Joinable、JoinHook三个类。 torch.distributed分布式通信包:后端能力对照、后端选择建议、常用环境变量、初始化方式等。
使用方式
通用 Join 上下文管理器
torch.distributed.algorithms.Join(joinables, enable=True, throw_on_early_termination=False, **kwargs) 允许在某个进程加入后调用自定义钩子,这些钩子应遮蔽未加入进程的集合通信,以防止挂起和报错并保证算法正确性。
注意事项:
- 上下文管理器要求每个参与的
Joinable在自身每次迭代的集合通信之前调用notify_join_context()。 - 要求所有
JoinHook对象中的process_group属性相同;若有多个JoinHook,则使用第一个的设备。
参数:
joinables(List[Joinable]):参与的 Joinable 列表,其钩子按给定顺序迭代。enable(bool):启用不均匀输入检测的标志,设为 False 会禁用上下文管理器功能,仅在用户确定输入不会不均匀时设置(默认 True)。throw_on_early_termination(bool):控制检测到不均匀输入时是否抛出异常(默认 False)。
Joinable 是抽象基类,需实现 join_hook()(返回 JoinHook 实例)、join_device() 和 join_process_group()。JoinHook 提供两个入口点:main_hook()(在存在未加入进程时反复调用,用于遮蔽训练迭代中的集合通信)和 post_hook(is_last_joiner)(所有进程加入后调用一次)。
torch.distributed 基础
torch.distributed 为跨一个或多个机器上多个计算节点的多进程并行提供 PyTorch 支持与通信原语。torch.nn.parallel.DistributedDataParallel() 在其之上提供同步分布式训练封装。与 torch.multiprocessing 和 torch.nn.DataParallel() 不同,它支持多台联网机器,且用户必须为每个进程显式启动一份独立的主训练脚本副本。
初始化需在使用其他方法前调用 torch.distributed.init_process_group() 或 torch.distributed.device_mesh.init_device_mesh(),两者都会阻塞直到所有进程加入。初始化不是线程安全的,进程组创建应在单个线程中执行。
init_process_group 有两种主要初始化方式:显式指定 store、rank、world_size;或指定 init_method(URL 字符串)以发现对等节点。若都未指定,init_method 默认为 "env://"。
适用场景
- 使用 CUDA GPU 进行分布式训练时使用 NCCL 后端;使用 XPU GPU 时使用 XCCL 后端;使用 CPU 进行分布式训练时使用 Gloo 后端。
- 具有 InfiniBand 互连的 GPU 主机使用 NCCL(当前唯一支持 InfiniBand 和 GPUDirect 的后端)。
- 具有以太网互连的 GPU 主机使用 NCCL,遇到问题时以 Gloo 作为回退。
- 具有 InfiniBand 互连的 CPU 主机:若 InfiniBand 启用了 IP over IB 则使用 Gloo,否则使用 MPI。
- 具有以太网互连的 CPU 主机使用 Gloo,除非有特定理由使用 MPI。
- 处理不均匀输入时使用通用 Join 上下文管理器。
限制
- 初始化不是线程安全的,进程组创建应在单个线程中执行,以防止各 rank 间 UUID 分配不一致以及初始化期间的竞争导致挂起。
- 使用 NCCL 后端且每台机器有多个进程时,每个进程必须独占访问其使用的每个 GPU,进程间共享 GPU 可能导致死锁或 NCCL 无效使用。
ucc后端为实验性。- MPI 是可选后端,仅在从源码构建 PyTorch 时才能包含。
- 截至 PyTorch v1.8,Windows 支持除 NCCL 外的所有集合通信后端。
- 关于 FSDP 的具体 API、安装命令、收费与价格信息,资料中暂未提供。