Transformers 4.37 中文文档(十九)(4)https://developer.aliyun.com/article/1564925
Trainer Deepspeed 集成
安装
通过 pypi 安装库:
pip install deepspeed
或通过 transformers
的 extras
:
pip install transformers[deepspeed]
或在 DeepSpeed 的 GitHub 页面 和 高级安装 上找到更多详细信息。
如果您仍在努力构建,请首先确保阅读 CUDA 扩展安装说明。
如果您没有预先构建扩展并依赖于运行时构建它们,并且尝试了以上所有解决方案仍无效,下一步尝试的是在安装之前预先构建模块。
要为 DeepSpeed 进行本地构建:
git clone https://github.com/microsoft/DeepSpeed/ cd DeepSpeed rm -rf build TORCH_CUDA_ARCH_LIST="8.6" DS_BUILD_CPU_ADAM=1 DS_BUILD_UTILS=1 pip install . \ --global-option="build_ext" --global-option="-j8" --no-cache -v \ --disable-pip-version-check 2>&1 | tee build.log
如果您打算使用 NVMe 卸载,还需要在上述说明中包含 DS_BUILD_AIO=1
(并在系统范围内安装 libaio-dev)。
编辑 TORCH_CUDA_ARCH_LIST
,插入您打算使用的 GPU 显卡的架构代码。假设所有显卡都相同,您可以通过以下方式获取架构:
CUDA_VISIBLE_DEVICES=0 python -c "import torch; print(torch.cuda.get_device_capability())"
如果您获得8, 6
,那么请使用TORCH_CUDA_ARCH_LIST="8.6"
。如果您有多张不同的显卡,可以列出所有显卡,例如TORCH_CUDA_ARCH_LIST="6.1;8.6"
。
如果您需要在多台机器上使用相同的设置,请制作一个二进制 wheel:
git clone https://github.com/microsoft/DeepSpeed/ cd DeepSpeed rm -rf build TORCH_CUDA_ARCH_LIST="8.6" DS_BUILD_CPU_ADAM=1 DS_BUILD_UTILS=1 \ python setup.py build_ext -j8 bdist_wheel
它将生成类似于dist/deepspeed-0.3.13+8cd046f-cp38-cp38-linux_x86_64.whl
的内容,现在您可以在本地或任何其他机器上安装为pip install deepspeed-0.3.13+8cd046f-cp38-cp38-linux_x86_64.whl
。
再次提醒确保调整TORCH_CUDA_ARCH_LIST
以匹配目标架构。
您可以在此处找到 NVIDIA GPU 的完整列表及其对应的计算能力(在此上下文中与架构相同)。
您可以使用以下命令检查 PyTorch 构建时使用的架构:
python -c "import torch; print(torch.cuda.get_arch_list())"
以下是如何查找已安装 GPU 之一的架构。例如,对于 GPU 0:
CUDA_VISIBLE_DEVICES=0 python -c "import torch; \ print(torch.cuda.get_device_properties(torch.device('cuda')))"
如果输出是:
_CudaDeviceProperties(name='GeForce RTX 3090', major=8, minor=6, total_memory=24268MB, multi_processor_count=82)
那么您就知道这张卡的架构是8.6
。
您也可以完全不使用TORCH_CUDA_ARCH_LIST
,然后构建程序将自动查询构建所在的 GPU 的架构。这可能与目标机器上的 GPU 不匹配,因此最好明确指定所需的架构。
如果尝试了所有建议的方法仍然遇到构建问题,请继续进行Deepspeed的 GitHub 问题处理,
使用多个 GPU 进行部署
要部署 DeepSpeed 集成,请调整 Trainer 命令行参数,包括一个新参数--deepspeed ds_config.json
,其中ds_config.json
是 DeepSpeed 配置文件,如此处所述。文件命名由您决定。建议使用 DeepSpeed 的add_config_arguments
实用程序向您的代码添加必要的命令行参数。有关更多信息,请参阅DeepSpeed 的参数解析文档。
您可以在此处使用您选择的启动器。您可以继续使用 pytorch 启动器:
torch.distributed.run --nproc_per_node=2 your_program.py <normal cl args> --deepspeed ds_config.json
或者使用deepspeed
提供的启动器:
deepspeed --num_gpus=2 your_program.py <normal cl args> --deepspeed ds_config.json
正如您所看到的参数不同,但对于大多数需求,任何一个都可以。有关如何配置各个节点和 GPU 的完整详细信息,请参阅此处。
当您使用deepspeed
启动器并且希望使用所有可用的 GPU 时,您可以只省略--num_gpus
标志。
以下是在 DeepSpeed 下部署所有可用 GPU 运行run_translation.py
的示例:
deepspeed examples/pytorch/translation/run_translation.py \ --deepspeed tests/deepspeed/ds_config_zero3.json \ --model_name_or_path t5-small --per_device_train_batch_size 1 \ --output_dir output_dir --overwrite_output_dir --fp16 \ --do_train --max_train_samples 500 --num_train_epochs 1 \ --dataset_name wmt16 --dataset_config "ro-en" \ --source_lang en --target_lang ro
请注意,在 DeepSpeed 文档中,您可能会看到--deepspeed --deepspeed_config ds_config.json
- 即两个与 DeepSpeed 相关的参数,但为了简单起见,并且已经有很多参数要处理,我们将两者合并为一个参数。
有关一些实际用例示例,请参阅此帖子。
使用单个 GPU 进行部署
使用单个 GPU 部署 DeepSpeed 时,请调整 Trainer 命令行参数如下:
deepspeed --num_gpus=1 examples/pytorch/translation/run_translation.py \ --deepspeed tests/deepspeed/ds_config_zero2.json \ --model_name_or_path t5-small --per_device_train_batch_size 1 \ --output_dir output_dir --overwrite_output_dir --fp16 \ --do_train --max_train_samples 500 --num_train_epochs 1 \ --dataset_name wmt16 --dataset_config "ro-en" \ --source_lang en --target_lang ro
这与多 GPU 几乎相同,但在这里我们明确告诉 DeepSpeed 仅使用一个 GPU 通过--num_gpus=1
。默认情况下,DeepSpeed 部署给定节点上可以看到的所有 GPU。如果您一开始只有 1 个 GPU,则不需要此参数。以下文档讨论了启动器选项。
为什么要仅使用一个 GPU 来使用 DeepSpeed?
- 它具有 ZeRO-offload 功能,可以将一些计算和内存委托给主机的 CPU 和 RAM,从而为模型的需求留下更多的 GPU 资源 - 例如更大的批量大小,或者启用一个通常无法适应的非常大的模型。
- 它提供了一个智能的 GPU 内存管理系统,可以最小化内存碎片化,这样可以使您适应更大的模型和数据批次。
虽然我们将在接下来详细讨论配置,但在 DeepSpeed 中获得单个 GPU 上的巨大改进的关键是至少在配置文件中具有以下配置:
{ "zero_optimization": { "stage": 2, "offload_optimizer": { "device": "cpu", "pin_memory": true }, "allgather_partitions": true, "allgather_bucket_size": 2e8, "reduce_scatter": true, "reduce_bucket_size": 2e8, "overlap_comm": true, "contiguous_gradients": true } }
它可以启用优化器卸载和一些其他重要功能。您可以尝试不同的缓冲区大小,在下面的讨论中会找到更多细节。
有关此类型部署的实际使用示例,请参见此帖子。
您还可以尝试使用 CPU 和 NVMe 卸载的 ZeRO-3,如本文档中进一步解释的那样。
注:
- 如果需要在特定 GPU 上运行,而不是 GPU 0,您不能使用
CUDA_VISIBLE_DEVICES
来限制可用 GPU 的可见范围。相反,您必须使用以下语法:
deepspeed --include localhost:1 examples/pytorch/translation/run_translation.py ...
- 在此示例中,我们告诉 DeepSpeed 使用 GPU 1(第二个 GPU)。
多节点部署
本节中的信息不是特定于 DeepSpeed 集成的,适用于任何多节点程序。但 DeepSpeed 提供了一个比其他启动器更容易使用的deepspeed
启动器,除非您在 SLURM 环境中。
在本节的持续时间内,让我们假设您有 2 个每个 8 个 GPU 的节点。您可以通过ssh hostname1
到达第一个节点,通过ssh hostname2
到达第二个节点,并且两个节点必须能够通过本地 ssh 无密码地相互到达。当然,您需要将这些主机(节点)名称重命名为您正在使用的实际主机名称。
torch.distributed.run(torchrun)启动器
例如,要使用torch.distributed.run
,您可以这样做:
python -m torch.distributed.run --nproc_per_node=8 --nnode=2 --node_rank=0 --master_addr=hostname1 \ --master_port=9901 your_program.py <normal cl args> --deepspeed ds_config.json
您必须 ssh 到每个节点并在每个节点上运行相同的命令!不用着急,启动器会等待直到两个节点同步。
有关更多信息,请参见torchrun。顺便说一句,这也是几个 pytorch 版本前替代了torch.distributed.launch
的启动器。
deepspeed 启动器
要使用deepspeed
启动器,您首先需要创建一个hostfile
文件:
hostname1 slots=8 hostname2 slots=8
然后您可以这样启动:
deepspeed --num_gpus 8 --num_nodes 2 --hostfile hostfile --master_addr hostname1 --master_port=9901 \ your_program.py <normal cl args> --deepspeed ds_config.json
与torch.distributed.run
启动器不同,deepspeed
将自动在两个节点上启动此命令!
有关更多信息,请参见资源配置(多节点)。
在 SLURM 环境中启动
在 SLURM 环境中可以使用以下方法。以下是一个 slurm 脚本launch.slurm
,您需要根据您特定的 SLURM 环境进行调整。
#SBATCH --job-name=test-nodes # name #SBATCH --nodes=2 # nodes #SBATCH --ntasks-per-node=1 # crucial - only 1 task per dist per node! #SBATCH --cpus-per-task=10 # number of cores per tasks #SBATCH --gres=gpu:8 # number of gpus #SBATCH --time 20:00:00 # maximum execution time (HH:MM:SS) #SBATCH --output=%x-%j.out # output file name export GPUS_PER_NODE=8 export MASTER_ADDR=$(scontrol show hostnames $SLURM_JOB_NODELIST | head -n 1) export MASTER_PORT=9901 srun --jobid $SLURM_JOBID bash -c 'python -m torch.distributed.run \ --nproc_per_node $GPUS_PER_NODE --nnodes $SLURM_NNODES --node_rank $SLURM_PROCID \ --master_addr $MASTER_ADDR --master_port $MASTER_PORT \ your_program.py <normal cl args> --deepspeed ds_config.json'
剩下的就是安排它运行:
sbatch launch.slurm
srun
将负责同时在所有节点上启动程序。
非共享文件系统的使用
默认情况下,DeepSpeed 期望多节点环境使用共享存储。如果不是这种情况,每个节点只能看到本地文件系统,您需要调整配置文件以包含一个checkpoint
_section,设置如下:
{ "checkpoint": { "use_node_local_storage": true } }
或者,您还可以使用 Trainer 的--save_on_each_node
参数,上述配置将自动添加给您。
笔记本中的部署
将笔记本单元格作为脚本运行的问题在于没有正常的deepspeed
启动器可供依赖,因此在某些设置下,我们必须模拟它。
如果您只使用 1 个 GPU,以下是您必须调整笔记本中的训练代码以使用 DeepSpeed 的方式。
# DeepSpeed requires a distributed environment even when only one process is used. # This emulates a launcher in the notebook import os os.environ["MASTER_ADDR"] = "localhost" os.environ["MASTER_PORT"] = "9994" # modify if RuntimeError: Address already in use os.environ["RANK"] = "0" os.environ["LOCAL_RANK"] = "0" os.environ["WORLD_SIZE"] = "1" # Now proceed as normal, plus pass the deepspeed config file training_args = TrainingArguments(..., deepspeed="ds_config_zero3.json") trainer = Trainer(...) trainer.train()
注意:...
代表您将传递给函数的常规参数。
如果要使用多个 GPU,必须使用多进程环境才能使 DeepSpeed 正常工作。也就是说,您必须使用该目的的启动器,而不能通过模拟本节开头介绍的分布式环境来实现。
如果您想在当前目录的笔记本中即时创建配置文件,可以使用专用单元格:
%%bash cat <<'EOT' > ds_config_zero3.json { "fp16": { "enabled": "auto", "loss_scale": 0, "loss_scale_window": 1000, "initial_scale_power": 16, "hysteresis": 2, "min_loss_scale": 1 }, "optimizer": { "type": "AdamW", "params": { "lr": "auto", "betas": "auto", "eps": "auto", "weight_decay": "auto" } }, "scheduler": { "type": "WarmupLR", "params": { "warmup_min_lr": "auto", "warmup_max_lr": "auto", "warmup_num_steps": "auto" } }, "zero_optimization": { "stage": 3, "offload_optimizer": { "device": "cpu", "pin_memory": true }, "offload_param": { "device": "cpu", "pin_memory": true }, "overlap_comm": true, "contiguous_gradients": true, "sub_group_size": 1e9, "reduce_bucket_size": "auto", "stage3_prefetch_bucket_size": "auto", "stage3_param_persistence_threshold": "auto", "stage3_max_live_parameters": 1e9, "stage3_max_reuse_distance": 1e9, "stage3_gather_16bit_weights_on_model_save": true }, "gradient_accumulation_steps": "auto", "gradient_clipping": "auto", "steps_per_print": 2000, "train_batch_size": "auto", "train_micro_batch_size_per_gpu": "auto", "wall_clock_breakdown": false }
如果训练脚本在普通文件中而不是在笔记本单元格中,您可以从单元格中正常启动deepspeed
。例如,要使用run_translation.py
,您可以这样启动它:
!git clone https://github.com/huggingface/transformers !cd transformers; deepspeed examples/pytorch/translation/run_translation.py ...
或者使用%%bash
魔术,您可以编写多行代码供 shell 程序运行:
%%bash git clone https://github.com/huggingface/transformers cd transformers deepspeed examples/pytorch/translation/run_translation.py ...
在这种情况下,您不需要本节开头呈现的任何代码。
注意:虽然%%bash
魔术很好,但目前它会缓冲输出,因此在进程完成之前您看不到日志。
配置
有关 DeepSpeed 配置文件中可用的 DeepSpeed 配置选项的完整指南,请参阅以下文档。
您可以在DeepSpeedExamples 存储库中找到数十个解决各种实际需求的 DeepSpeed 配置示例:
git clone https://github.com/microsoft/DeepSpeedExamples cd DeepSpeedExamples find . -name '*json'
继续上面的代码,假设您想配置 Lamb 优化器。因此,您可以搜索示例.json
文件:
grep -i Lamb $(find . -name '*json')
在主存储库中还可以找到更多示例。
使用 DeepSpeed 时,您始终需要提供一个 DeepSpeed 配置文件,但是某些配置参数必须通过命令行进行配置。您将在本指南的其余部分中找到细微差别。
要了解 DeepSpeed 配置文件的外观,这里有一个激活 ZeRO 阶段 2 功能的示例,包括优化器状态 cpu 卸载,使用AdamW
优化器和WarmupLR
调度程序,并且如果传递了--fp16
,将启用混合精度训练:
{ "fp16": { "enabled": "auto", "loss_scale": 0, "loss_scale_window": 1000, "initial_scale_power": 16, "hysteresis": 2, "min_loss_scale": 1 }, "optimizer": { "type": "AdamW", "params": { "lr": "auto", "betas": "auto", "eps": "auto", "weight_decay": "auto" } }, "scheduler": { "type": "WarmupLR", "params": { "warmup_min_lr": "auto", "warmup_max_lr": "auto", "warmup_num_steps": "auto" } }, "zero_optimization": { "stage": 2, "offload_optimizer": { "device": "cpu", "pin_memory": true }, "allgather_partitions": true, "allgather_bucket_size": 2e8, "overlap_comm": true, "reduce_scatter": true, "reduce_bucket_size": 2e8, "contiguous_gradients": true }, "gradient_accumulation_steps": "auto", "gradient_clipping": "auto", "train_batch_size": "auto", "train_micro_batch_size_per_gpu": "auto", }
当您执行程序时,DeepSpeed 将记录从 Trainer 接收到的配置到控制台,因此您可以看到最终传递给它的配置。
传递配置
如本文所述,通常将 DeepSpeed 配置作为 json 文件的路径传递,但如果您不使用命令行界面配置训练,而是通过 TrainingArguments 实例化 Trainer,那么对于deepspeed
参数,您可以传递一个嵌套的dict
。这允许您即时创建配置,而无需将其写入文件系统后再传递给 TrainingArguments。
总结一下,您可以执行以下操作:
TrainingArguments(..., deepspeed="/path/to/ds_config.json")
或者:
ds_config_dict = dict(scheduler=scheduler_params, optimizer=optimizer_params) TrainingArguments(..., deepspeed=ds_config_dict)
共享配置
这一部分是必读的
某些配置值对于 Trainer 和 DeepSpeed 的正确运行都是必需的,因此,为了防止冲突的定义,可能导致难以检测的错误,我们选择通过 Trainer 命令行参数进行配置。
此外,一些配置值是根据模型的配置自动派生的,因此,与其记住手动调整多个值,不如让 Trainer 为您完成大部分配置。
因此,在本指南的其余部分中,您将找到一个特殊的配置值:auto
,设置后将自动替换为正确或最有效的值。请随意选择忽略此建议并显式设置值,在这种情况下,请非常小心,确保您的 Trainer 参数和 DeepSpeed 配置一致。例如,您是否使用相同的学习率、批量大小或梯度累积设置?如果这些不匹配,训练可能会以非常难以检测的方式失败。您已经被警告了。
还有多个其他值是专门针对 DeepSpeed 的,您将需要手动设置以满足您的需求。
在您自己的程序中,如果您想要以主控的方式修改 DeepSpeed 配置并基于此配置 TrainingArguments ,您也可以使用以下方法。步骤如下:
- 创建或加载要用作主配置的 DeepSpeed 配置
- 基于这些值创建 TrainingArguments 对象
请注意,一些值,例如scheduler.params.total_num_steps
是由 Trainer 在train
期间计算的,但您当然也可以自己进行计算。
ZeRO
Zero Redundancy Optimizer (ZeRO) 是 DeepSpeed 的主要工具。它支持 3 个不同级别(阶段)的优化。第一个对于可伸缩性目的并不太有趣,因此本文档侧重于阶段 2 和 3。阶段 3 通过最新的 ZeRO-Infinity 进一步改进。您可以在 DeepSpeed 文档中找到更详细的信息。
配置文件中的zero_optimization
部分是最重要的部分(文档),因为在那里您定义了要启用哪些 ZeRO 阶段以及如何配置它们。您可以在 DeepSpeed 文档中找到每个参数的解释。
此部分必须通过 DeepSpeed 配置进行独占配置 - Trainer 不提供等效的命令行参数。
注意:目前 DeepSpeed 不验证参数名称,因此如果您拼写错误,它将使用拼写错误的参数的默认设置。您可以查看 DeepSpeed 引擎启动日志消息,以查看它将使用哪些值。
ZeRO-2 配置
以下是 ZeRO 阶段 2 的配置示例:
{ "zero_optimization": { "stage": 2, "offload_optimizer": { "device": "cpu", "pin_memory": true }, "allgather_partitions": true, "allgather_bucket_size": 5e8, "overlap_comm": true, "reduce_scatter": true, "reduce_bucket_size": 5e8, "contiguous_gradients": true } }
性能调优:
- 启用
offload_optimizer
应该减少 GPU RAM 的使用(需要"stage": 2
) "overlap_comm": true
通过增加 GPU RAM 使用量来降低全局归约延迟。overlap_comm
使用 4.5 倍的allgather_bucket_size
和reduce_bucket_size
值。因此,如果它们设置为 5e8,这将需要 9GB 的占用空间(5e8 x 2 字节 x 2 x 4.5
)。因此,如果您的 GPU 具有 8GB 或更少的 RAM,为了避免出现 OOM 错误,您需要将这些参数减少到约2e8
,这将需要 3.6GB。如果您的 GPU 容量更大,但开始出现 OOM 错误,您也需要做同样的操作。- 当减少这些缓冲区时,您正在交换通信速度以获得更多的 GPU RAM。缓冲区大小越小,通信速度越慢,可用于其他任务的 GPU RAM 就越多。因此,如果更大的批量大小很重要,稍微减慢训练时间可能是一个不错的交易。
此外,deepspeed==0.4.4
添加了一个新选项round_robin_gradients
,您可以通过以下方式启用:
{ "zero_optimization": { "round_robin_gradients": true } }
这是用于 CPU 卸载的阶段 2 优化,通过细粒度梯度分区将梯度复制到 CPU 内存中,以在等级之间并行化。性能收益随着梯度累积步骤(在优化器步骤之间的更多复制)或 GPU 数量(增加并行性)而增加。
ZeRO-3 配置
以下是 ZeRO 阶段 3 的配置示例:
{ "zero_optimization": { "stage": 3, "offload_optimizer": { "device": "cpu", "pin_memory": true }, "offload_param": { "device": "cpu", "pin_memory": true }, "overlap_comm": true, "contiguous_gradients": true, "sub_group_size": 1e9, "reduce_bucket_size": "auto", "stage3_prefetch_bucket_size": "auto", "stage3_param_persistence_threshold": "auto", "stage3_max_live_parameters": 1e9, "stage3_max_reuse_distance": 1e9, "stage3_gather_16bit_weights_on_model_save": true } }
如果您遇到 OOM,因为您的模型或激活不适合 GPU 内存,并且您有未使用的 CPU 内存,将优化器状态和参数卸载到 CPU 内存并使用"device": "cpu"
可能解决此限制。如果您不想卸载到 CPU 内存,请在device
条目中使用none
而不是cpu
。有关卸载到 NVMe 的更多信息,请参阅下文。
通过将pin_memory
设置为true
启用了固定内存。这个功能可以提高吞吐量,但会减少其他进程可用的内存。固定内存被保留给请求它的特定进程,通常比普通 CPU 内存访问速度快得多。
性能调优:
stage3_max_live_parameters
:1e9
stage3_max_reuse_distance
:1e9
如果遇到 OOM,请减少stage3_max_live_parameters
和stage3_max_reuse_distance
。除非进行激活检查点,否则它们对性能影响很小。1e9
将消耗约 2GB。内存由stage3_max_live_parameters
和stage3_max_reuse_distance
共享,因此不是累加的,而是总共 2GB。
stage3_max_live_parameters
是您希望在任何给定时间保留在 GPU 上的完整参数的上限。"重用距离"是我们使用的度量标准,用于确定参数在未来何时再次使用,我们使用stage3_max_reuse_distance
来决定是丢弃参数还是保留参数。如果参数将在不久的将来(小于stage3_max_reuse_distance
)再次使用,则我们保留它以减少通信开销。当启用激活检查点时,这非常有帮助,我们在前向重计算和反向传递中以单层粒度执行操作,并希望在前向重计算中保留参数直到反向传递。
以下配置值取决于模型的隐藏大小:
reduce_bucket_size
:hidden_size*hidden_size
stage3_prefetch_bucket_size
:0.9 * hidden_size * hidden_size
stage3_param_persistence_threshold
:10 * hidden_size
因此将这些值设置为auto
,Trainer 将自动分配推荐值。当然,您也可以显式设置这些值。
stage3_gather_16bit_weights_on_model_save
在模型保存时启用模型 fp16 权重合并。对于大型模型和多个 GPU,这是一项昂贵的操作,无论是在内存还是速度方面。如果您计划恢复训练,则目前需要这样做。请注意未来的更新将消除此限制并使事情更加灵活。
如果您正在从 ZeRO-2 配置迁移,请注意allgather_partitions
、allgather_bucket_size
和reduce_scatter
配置参数在 ZeRO-3 中不使用。如果您将这些保留在配置文件中,它们将被忽略。
sub_group_size
:1e9
sub_group_size
控制参数在优化器步骤中更新的粒度。参数被分组到sub_group_size
的桶中,每个桶依次更新。在 ZeRO-Infinity 中与 NVMe 卸载一起使用时,sub_group_size
因此控制模型状态在优化器步骤期间从 NVMe 移入和移出 CPU 内存的粒度。这可以防止极大型模型耗尽 CPU 内存。
如果不使用 NVMe 卸载,可以将sub_group_size
保留为默认值1e9。在以下情况下,您可能需要更改其默认值:
- 在优化器步骤中遇到 OOM:减少
sub_group_size
以减少临时缓冲区的内存利用 - 优化器步骤花费很长时间:增加
sub_group_size
以提高带宽利用率,因为数据缓冲区增加。
ZeRO-0 配置
请注意,我们将阶段 0 和 1 列在最后,因为它们很少被使用。
阶段 0 是禁用所有类型的分片,只使用 DeepSpeed 作为 DDP。您可以通过以下方式打开它:
{ "zero_optimization": { "stage": 0 } }
这将基本上禁用 ZeRO,而无需更改其他任何内容。
ZeRO-1 配置
阶段 1 是阶段 2 减去梯度分片。您可以尝试将优化器状态分片,以加快速度:
{ "zero_optimization": { "stage": 1 } }
Transformers 4.37 中文文档(十九)(6)https://developer.aliyun.com/article/1564927