Transformers 4.37 中文文档(十九)(5)

简介: Transformers 4.37 中文文档(十九)

Transformers 4.37 中文文档(十九)(4)https://developer.aliyun.com/article/1564925


Trainer Deepspeed 集成

安装

通过 pypi 安装库:

pip install deepspeed

或通过 transformersextras

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?

  1. 它具有 ZeRO-offload 功能,可以将一些计算和内存委托给主机的 CPU 和 RAM,从而为模型的需求留下更多的 GPU 资源 - 例如更大的批量大小,或者启用一个通常无法适应的非常大的模型。
  2. 它提供了一个智能的 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 ,您也可以使用以下方法。步骤如下:

  1. 创建或加载要用作主配置的 DeepSpeed 配置
  2. 基于这些值创建 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_sizereduce_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_parameters1e9
  • stage3_max_reuse_distance1e9

如果遇到 OOM,请减少stage3_max_live_parametersstage3_max_reuse_distance。除非进行激活检查点,否则它们对性能影响很小。1e9将消耗约 2GB。内存由stage3_max_live_parametersstage3_max_reuse_distance共享,因此不是累加的,而是总共 2GB。

stage3_max_live_parameters是您希望在任何给定时间保留在 GPU 上的完整参数的上限。"重用距离"是我们使用的度量标准,用于确定参数在未来何时再次使用,我们使用stage3_max_reuse_distance来决定是丢弃参数还是保留参数。如果参数将在不久的将来(小于stage3_max_reuse_distance)再次使用,则我们保留它以减少通信开销。当启用激活检查点时,这非常有帮助,我们在前向重计算和反向传递中以单层粒度执行操作,并希望在前向重计算中保留参数直到反向传递。

以下配置值取决于模型的隐藏大小:

  • reduce_bucket_sizehidden_size*hidden_size
  • stage3_prefetch_bucket_size0.9 * hidden_size * hidden_size
  • stage3_param_persistence_threshold10 * hidden_size

因此将这些值设置为auto,Trainer 将自动分配推荐值。当然,您也可以显式设置这些值。

stage3_gather_16bit_weights_on_model_save在模型保存时启用模型 fp16 权重合并。对于大型模型和多个 GPU,这是一项昂贵的操作,无论是在内存还是速度方面。如果您计划恢复训练,则目前需要这样做。请注意未来的更新将消除此限制并使事情更加灵活。

如果您正在从 ZeRO-2 配置迁移,请注意allgather_partitionsallgather_bucket_sizereduce_scatter配置参数在 ZeRO-3 中不使用。如果您将这些保留在配置文件中,它们将被忽略。

  • sub_group_size1e9

sub_group_size控制参数在优化器步骤中更新的粒度。参数被分组到sub_group_size的桶中,每个桶依次更新。在 ZeRO-Infinity 中与 NVMe 卸载一起使用时,sub_group_size因此控制模型状态在优化器步骤期间从 NVMe 移入和移出 CPU 内存的粒度。这可以防止极大型模型耗尽 CPU 内存。

如果不使用 NVMe 卸载,可以将sub_group_size保留为默认值1e9。在以下情况下,您可能需要更改其默认值:

  1. 在优化器步骤中遇到 OOM:减少sub_group_size以减少临时缓冲区的内存利用
  2. 优化器步骤花费很长时间:增加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

相关实践学习
部署Stable Diffusion玩转AI绘画(GPU云服务器)
本实验通过在ECS上从零开始部署Stable Diffusion来进行AI绘画创作,开启AIGC盲盒。
相关文章
|
4月前
|
缓存 异构计算 索引
Transformers 4.37 中文文档(二十一)(5)
Transformers 4.37 中文文档(二十一)
27 0
|
4月前
|
存储 自然语言处理 PyTorch
Transformers 4.37 中文文档(二十一)(1)
Transformers 4.37 中文文档(二十一)
48 0
|
4月前
|
PyTorch 测试技术 TensorFlow
Transformers 4.37 中文文档(二十一)(2)
Transformers 4.37 中文文档(二十一)
30 0
|
4月前
|
PyTorch 测试技术 TensorFlow
Transformers 4.37 中文文档(二十一)(3)
Transformers 4.37 中文文档(二十一)
30 0
|
4月前
|
缓存 异构计算 索引
Transformers 4.37 中文文档(二十一)(4)
Transformers 4.37 中文文档(二十一)
30 0
|
4月前
|
存储 PyTorch 算法框架/工具
Transformers 4.37 中文文档(十九)(4)
Transformers 4.37 中文文档(十九)
265 2
|
4月前
|
存储 机器学习/深度学习 异构计算
Transformers 4.37 中文文档(十九)(8)
Transformers 4.37 中文文档(十九)
177 2
|
4月前
|
算法 API 调度
Transformers 4.37 中文文档(十九)(6)
Transformers 4.37 中文文档(十九)
75 2
|
4月前
|
存储 PyTorch API
Transformers 4.37 中文文档(十九)(2)
Transformers 4.37 中文文档(十九)
299 1
|
4月前
|
存储 PyTorch 算法框架/工具
Transformers 4.37 中文文档(十九)(3)
Transformers 4.37 中文文档(十九)
43 1