低精度训练方法
Accelerate 通过 TransformersEngine
和 MS-AMP
包提供了集成,以使用指定的支持硬件进行低精度训练。本文档将帮助你了解支持的硬件、如何配置你的 [Accelerator
] 以利用低精度方法,以及训练时可以期待的结果。
FP8 训练的含义
要深入了解使用 PyTorch 和 Accelerate 进行 FP8 训练的细节,请参阅 concept_guide,了解为什么这可能会很困难。但本质上,与其使用 BF16 进行训练,模型训练的某些(或全部)方面可以使用 8 位而不是 16 位。挑战在于在不降低最终性能的情况下实现这一点。
这仅在特定的 NVIDIA 硬件上启用,具体包括:
- 3000 系列之后的消费级显卡(如 4090)
- 基于 Hopper 架构的 GPU(如
H100
和H200
)
这将导致内存使用量的减少(因为我们已经将某些训练部分所需的内存减少了一半),并且对于可以替换某些层为 FP8 支持层的较大模型,吞吐量 应该 也会增加。
配置 Accelerator
目前支持两种不同的 FP8 后端(TransformersEngine
和 MS-AMP
),每种后端具有不同的功能和配置。
要使用其中任何一种,可以使用相同的核心 API。只需将 mixed_precision="fp8"
传递给 [Accelerator
],在 accelerate config
提示关于混合精度时选择,或在 config.yaml
文件的 mixed_precision
键中设置。
from accelerate import Accelerator
accelerator = Accelerator(mixed_precision="fp8")
默认情况下,如果你的环境中存在 MS-AMP
,Accelerate 将自动将其用作后端。要自行指定(并自定义 FP8 混合精度设置的其他部分),你可以使用 [utils.FP8RecipeKwargs
] 或在你的配置 yaml
文件中或在 accelerate launch
时进行指定:
from accelerate import Accelerator
from accelerate.utils import FP8RecipeKwargs
kwargs = [FP8RecipeKwargs(backend="msamp")]
# Or to specify the backend as `TransformersEngine` even if MS-AMP is installed
# kwargs = [FP8RecipeKwargs(backend="te")]
accelerator = Accelerator(mixed_precision="fp8", kwarg_handlers=kwargs)
mixed_precision: fp8
fp8_config:
amax_compute_algorithm: max
amax_history_length: 1024
backend: TE
fp8_format: HYBRID
interval: 1
margin: 0
override_linear_precision: false
use_autocast_during_eval: false
配置 MS-AMP
在两者中,MS-AMP
传统上更容易配置,因为它只有一个参数:优化级别。
目前在 Accelerate 集成中支持两个优化级别,"O1"
和 "O2"
(使用字母 'o',而不是数字 0)。
"O1"
会将权重梯度和all_reduce
通信转换为 8 位,而其余部分则使用 16 位。这减少了总体 GPU 内存使用并加快了通信带宽。"O2"
还会将一阶优化器状态转换为 8 位,而二阶状态则为 FP16(目前仅支持Adam
优化器)。这尽量减少最终的精度损失,并节省最多的潜在内存。
要指定优化级别,请通过设置 optimization_level
参数将其传递给 FP8KwargsHandler
:
from accelerate import Accelerator
from accelerate.utils import FP8RecipeKwargs
kwargs = [FP8RecipeKwargs(backend="msamp", optimization_level="O2")]
accelerator = Accelerator(mixed_precision="fp8", kwarg_handlers=kwargs)
或者在使用 accelerate launch
时通过 --fp8_backend=msamp --fp8_opt_level=O2
同样,你也可以在 config.yaml
中设置:
mixed_precision: fp8
fp8_config:
backend: MSAMP
opt_level: O2
配置 TransformersEngine
TransformersEngine 提供了更多选项来定制如何执行 FP8 计算。支持的参数及其含义的完整列表可以在 NVIDIA 的文档 中找到,但为了方便起见,这些参数也在 [FP8KwargsHandler
的文档字符串中进行了重述。
Accelerate 尝试设置合理的默认值,但自行探索和调整这些参数可能会带来更好的性能。
要使用它,请指定 backend="te"
并根据需要修改 kwarg 处理器中的任何参数:
from accelerate import Accelerator
from accelerate.utils import FP8RecipeKwargs
kwargs = [FP8RecipeKwargs(backend="te", ...)]
accelerator = Accelerator(mixed_precision="fp8", kwarg_handlers=kwargs)
或者在使用 accelerate launch
时通过 --fp8_backend=te ...
来设置。使用 accelerate launch --fp8_backend=te -h
查看相关参数。
同样,你也可以在 config.yaml
中设置:
mixed_precision: fp8
fp8_config:
amax_compute_algorithm: max
amax_history_length: 1024
backend: TE
fp8_format: HYBRID
interval: 1
margin: 0
override_linear_precision: false
use_autocast_during_eval: false
示例动物园
我们提供了使用 FP8 进行训练的示例,这些示例既包括使用 accelerate
的实现,也包括其底层实现,可在 accelerate
仓库中找到。 目前我们支持以下脚本示例:
- 单 GPU
- 分布式数据并行(多 GPU)
- 完全分片数据并行
- DeepSpeed ZeRO 1 至 3
了解更多请访问 这里
进一步阅读
要了解更多关于使用 FP8 进行训练的信息,请查阅以下资源:
- 我们的概念指南,详细介绍了 TransformersEngine 和 MS-AMP
- TransformersEngine 文档
- MS-AMP 文档