1、DeepSpeed功能支持
DeepSpeed实现了ZeRO论文中描述的所有内容。目前,它提供对以下功能的全面支持:
- 优化器状态分区(ZeRO stage 1)
- 梯度分区(ZeRO stage 2)
- 参数分区(ZeRO stage 3)
- 自定义混合精度训练处理
- 一系列基于CUDA扩展的快速优化器
- ZeRO-Offload 到 CPU 和 NVMe
ZeRO-Offload有其自己的专门论文:ZeRO-Offload: Democratizing Billion-Scale Model Training。而NVMe支持在论文ZeRO-Infinity: Breaking the GPU Memory Wall for Extreme Scale Deep Learning中进行了描述。
DeepSpeed ZeRO-2主要用于训练,因为它的特性对推理没有用处。
DeepSpeed ZeRO-3也可以用于推理,因为它允许将单个GPU无法加载的大模型加载到多个GPU上。
🤗 Transformers通过以下两种方式集成了DeepSpeed:
- 通过
Trainer
集成核心的DeepSpeed功能。这是一种“为您完成一切”式的集成 - 您只需提供自定义配置文件或使用我们的模板配置文件。本文档的大部分内容都集中在这个功能上。 - 如果您不使用
Trainer
并希望在自己的Trainer中集成DeepSpeed,那么像from_pretrained
和from_config
这样的核心功能函数将包括ZeRO stage 3及以上的DeepSpeed的基础部分,如zero.Init
。要利用此功能,请阅读有关非Trainer DeepSpeed集成的文档。
2、transformer trainer集成参数
- sharded_ddp (bool, str 或 ShardedDDPOption 列表, 可选, 默认为''):是否在分布式训练中使用 Sharded DDP(Sharded Data Parallelism),这是由 FairScale提供的,默认不使用,简单解释一下: FairScale 是Mate开发的一个用于高性能和大规模训练的 PyTorch 扩展库。这个库扩展了基本的 PyTorch 功能,同时引入了最新的先进规模化技术,通过可组合的模块和易于使用的API,提供了最新的分布式训练技术。详细的可以看其官网。
- fsdp (bool, str 或 FSDPOption 列表, 可选, 默认为''):用于指定是否要启用 PyTorch 的 FSDP(Fully Sharded Data Parallel Training),以及如何配置分布式并行训练。
- fsdp_config (str 或 dict, 可选):用于配置 PyTorch 的 FSDP(Fully Sharded Data Parallel Training)的配置文件
- deepspeed (str 或 dict, 可选):用于指定是否要启用 DeepSpeed,以及如何配置 DeepSpeed。也是目前分布式训练使用最多的框架,比上面pytorch原生分布式训练以及FairScale用的范围更广,详细的可以看其官网。
- ddp_find_unused_parameters (bool, 可选):当你使用分布式训练时,这个参数用于控制是否查找并处理那些在计算中没有被使用的参数,如果启用了梯度检查点(gradient checkpointing),表示部分参数是惰性加载的,这时默认值为 False,因为梯度检查点本身已经考虑了未使用的参数,如果没有启用梯度检查点,默认值为 True,表示要查找并处理所有参数,以确保它们的梯度被正确传播。
- ddp_bucket_cap_mb (int, 可选):在分布式训练中,数据通常分成小块进行处理,这些小块称为"桶",这个参数用于指定每个桶的最大内存占用大小,一般自动分配即可。
- ddp_broadcast_buffers (bool, 可选):在分布式训练中,模型的某些部分可能包含缓冲区,如 Batch Normalization 层的统计信息,这个参数用于控制是否将这些缓冲区广播到所有计算设备,以确保模型在不同设备上保持同步,如果启用了梯度检查点,表示不需要广播缓冲区,因为它们不会被使用,如果没有启用梯度检查点,默认值为 True,表示要广播缓冲区,以确保模型的不同部分在所有设备上都一致。
- ddp_timeout (int, 可选, 默认为 1800):用于 torch.distributed.init_process_group 调用的超时时间,在分布式运行中执行较慢操作时,用于避免超时,具体的可以看 PyTorch 文档 。
- per_device_train_batch_size (int, 可选, 默认为 8):用于指定训练的每个GPU/XPU/TPU/MPS/NPU/CPU的batch,每个训练步骤中每个硬件上的样本数量。
- per_device_eval_batch_size (int, 可选, 默认为 8):用于指定评估的每个GPU/XPU/TPU/MPS/NPU/CPU的batch,每个评估步骤中每个硬件上的样本数量。
- gradient_accumulation_steps (int, 可选, 默认为 1):用于指定在每次更新模型参数之前,梯度积累的更新步数。使得梯度积累可以在多个batch上累积梯度,然后更新模型参数,就可以在显存不够的情况下执行大batch的反向传播。
假设我们有4张卡,每张卡的batch size为8,那么一个steps的batch size就是32,如果我们这个参数设置为4,那么相当于一个batch训练样本数量就是128。好处:显存不够增大此参数。 - eval_accumulation_steps (int, 可选):指定在执行评估时,模型会累积多少个预测步骤的输出张量,然后才将它们从GPU/NPU/TPU移动到CPU上,默认是整个评估的输出结果将在GPU/NPU/TPU上累积,然后一次性传输到CPU,速度更快,但占显存。
https://huggingface.co/docs/transformers/main/zh/main_classes/deepspeed