训练概述和功能

概述

训练先进的深度学习模型具有挑战性。除了模型设计之外,模型科学家还需要设置最先进的训练技术,例如分布式训练、混合精度、梯度累积和检查点。然而,科学家可能无法实现预期的系统性能和收敛速度。大型模型尺寸更具挑战性:大型模型在纯数据并行的情况下很容易耗尽内存,并且难以使用模型并行。DeepSpeed 解决了这些挑战,以加速模型开发 *和* 训练。

轻松实现分布式、有效和高效的训练

DeepSpeed API 是 PyTorch 上的轻量级包装器。这意味着您可以使用 PyTorch 中的所有功能,而无需学习新的平台。此外,DeepSpeed 管理所有样板最先进的训练技术,例如分布式训练、混合精度、梯度累积和检查点,以便您可以专注于模型开发。最重要的是,您可以利用 DeepSpeed 独具特色的效率和有效性优势,只需对您的 PyTorch 模型进行几行代码更改即可提高速度和规模。

速度

DeepSpeed 通过对计算/通信/内存/IO 的效率优化以及对高级超参数调整和优化器的有效性优化相结合,实现了高性能和快速收敛。例如

  • DeepSpeed 使用 1024 个 V100 GPU(64 个 DGX-2 盒子)在 44 分钟内将 BERT-large 训练到同等水平,使用 256 个 GPU(16 个 DGX-2 盒子)在 2.4 小时内完成训练。

    BERT-large 训练时间

    设备 来源 训练时间
    1024 个 V100 GPU DeepSpeed 44 分钟
    256 个 V100 GPU DeepSpeed 2.4 小时
    64 个 V100 GPU DeepSpeed 8.68 小时
    16 个 V100 GPU DeepSpeed 33.22 小时

    BERT 代码和教程将很快提供。

  • DeepSpeed 在 Azure GPU 上比最先进的 NVIDIA Megatron 快 3.75 倍地训练 GPT2(15 亿个参数)。

    阅读更多GPT 教程

内存效率

DeepSpeed 提供内存高效的数据并行,并支持在没有模型并行的情况下训练模型。例如,DeepSpeed 可以在一个 GPU 上训练高达 130 亿个参数的模型。相比之下,现有的框架(例如 PyTorch 的分布式数据并行)在 14 亿个参数模型的情况下会耗尽内存。

DeepSpeed 通过一种名为零冗余优化器 (ZeRO) 的新颖解决方案减少了训练内存占用。与基本数据并行(其中内存状态在数据并行进程中复制)不同,ZeRO 将模型状态和梯度分区以节省大量内存。此外,它还减少了激活内存和碎片内存。当前的实现(ZeRO-2)与最先进的技术相比,内存减少了高达 8 倍。您可以阅读更多关于 ZeRO 的内容,请参阅我们的 论文,以及我们与 ZeRO-1ZeRO-2 相关的博客文章。

凭借这种令人印象深刻的内存减少,DeepSpeed 的早期采用者已经创建了一个名为 Turing-NLG 的拥有超过 170 亿个参数的语言模型 (LM),在 LM 类别中创下了新的 SOTA。

对于 GPU 资源有限的模型科学家,ZeRO-Offload 利用 CPU 和 GPU 内存来训练大型模型。使用一台具有 **单个 GPU** 的机器,我们的用户可以运行 **高达 130 亿个参数的模型**,而不会耗尽内存,是现有方法的 10 倍,同时获得有竞争力的吞吐量。此功能使数十亿参数模型训练民主化,并为许多深度学习从业者探索更大更好的模型打开了窗口。

可扩展性

DeepSpeed 支持高效的数据并行、模型并行、流水线并行以及它们的组合,我们将其称为 3D 并行。

  • DeepSpeed 的 3D 并行提供系统支持以运行具有数万亿参数的模型,请阅读更多内容,请参阅我们的 新闻稿教程
  • DeepSpeed 可以更有效地运行大型模型,对于尺寸从 15 亿到数百亿不等的模型,速度提高高达 10 倍。 更具体地说,由 ZeRO 提供支持的数据并行是互补的,可以与不同类型的模型并行相结合。它允许 DeepSpeed 使用较低程度的模型并行和较高的批次大小来拟合模型,与单独使用模型并行相比,提供了显著的性能提升。

    阅读更多ZeRO 论文GPT 教程

DeepSpeed Speedup

该图描述了 DeepSpeed(将 ZeRO 支持的数据并行与 NVIDIA Megatron-LM 的模型并行相结合)与单独使用 Megatron-LM 相比的系统吞吐量改进。

通信效率

DeepSpeed 的流水线并行减少了分布式训练期间的通信量,这使用户能够在网络带宽有限的集群上以 2-7 倍的速度训练数十亿参数模型。 低带宽 GPT-2 性能

1 位 Adam、0/1 Adam 和 1 位 LAMB 将通信量减少高达 26 倍,同时实现与 Adam 相似的收敛效率,从而能够扩展到不同类型的 GPU 集群和网络。1 位 Adam 博客文章1 位 Adam 教程0/1 Adam 教程1 位 LAMB 教程

数据效率

DeepSpeed 数据效率库通过课程学习提供高效的数据采样,并通过随机层级标记下降提供高效的数据路由。组合的解决方案在 GPT-3/BERT 预训练和 GPT/ViT 微调期间可以节省高达 2 倍的数据和 2 倍的时间,或者在相同数据/时间下进一步提高模型质量。请参阅 教程 中的更多信息。

支持长序列长度

DeepSpeed 提供稀疏注意力内核——一项支持模型输入长序列的基本技术,无论是文本、图像还是声音。与经典的密集 Transformer 相比,它支持 **长一个数量级的输入序列**,并以可比的精度获得高达 6 倍的执行速度。它还优于最先进的稀疏实现,执行速度快 1.5-3 倍。此外,我们的稀疏内核支持灵活的稀疏格式的高效执行,并使用户能够在其自定义稀疏结构上进行创新。在这里了解更多信息

快速收敛以提高效率

DeepSpeed 支持高级超参数调整和超大批次大小优化器,例如 LAMB。这些提高了模型训练的有效性,并减少了收敛到所需精度所需的样本数量。

阅读更多调整教程

良好的可用性

只需更改几行代码即可使 PyTorch 模型使用 DeepSpeed 和 ZeRO。与当前的模型并行库相比,DeepSpeed 不需要代码重新设计或模型重构。它也不限制模型维度(例如注意力头的数量、隐藏大小等)、批次大小或任何其他训练参数。对于高达 130 亿个参数的模型,您可以方便地使用 ZeRO 支持的数据并行,而无需模型并行,而相比之下,标准数据并行在模型参数超过 14 亿的情况下将耗尽内存。此外,DeepSpeed 方便地支持将 ZeRO 支持的数据并行与自定义模型并行(例如 NVIDIA 的 Megatron-LM 的张量切片)灵活组合。

功能

下面我们提供一个简短的功能列表,请参阅我们的详细 功能概述 以了解描述和用法。

  • 使用混合精度的分布式训练
    • 16 位混合精度
    • 单 GPU/多 GPU/多节点
  • 模型并行
    • 支持自定义模型并行
    • 与 Megatron-LM 集成
  • 流水线并行
    • 3D 并行
  • 零冗余优化器
    • 优化器状态和梯度分区
    • 激活分区
    • 常数缓冲区优化
    • 连续内存优化
  • ZeRO-Offload
    • 利用 CPU/GPU 内存进行模型训练
    • 支持在单个 GPU 上训练 100 亿模型
  • 超快的密集 Transformer 内核
  • 稀疏注意力
    • 内存和计算效率高的稀疏内核
    • 支持比密集模型长 10 倍的序列
    • 灵活支持不同的稀疏结构
  • 1 位 Adam0/1 Adam1 位 LAMB
    • 自定义通信集合
    • 通信量节省高达 26 倍
  • 其他内存和带宽优化
    • 智能梯度累积
    • 通信/计算重叠
  • 训练功能
    • 简化的训练 API
    • 梯度裁剪
    • 混合精度自动损失缩放
  • 训练优化器
    • 融合 Adam 优化器和任意 torch.optim.Optimizer
    • 内存带宽优化的 FP16 优化器
    • 使用 LAMB 优化器的超大批次训练
    • 使用 ZeRO 优化器进行内存高效训练
    • CPU-Adam
  • 训练无关的检查点
  • 高级参数搜索
    • 学习率范围测试
    • 1 周期学习率计划
  • 简化的数据加载器
  • 数据效率
    • 通过课程学习提供高效的数据采样,并通过随机层级标记下降提供高效的数据路由
    • 在 GPT-3/BERT 预训练和 GPT/ViT 微调期间可以节省高达 2 倍的数据和 2 倍的时间
    • 或者在相同数据/时间下进一步提高模型质量
  • 课程学习
    • 基于课程学习的数据管道,在训练过程中优先呈现更简单或更容易的示例。
    • 稳定且速度提升 3.3 倍的 GPT-2 预训练,在保持 token 级收敛速度的同时,将 batch 大小和学习率分别提高 8 倍和 4 倍。
    • 与许多其他 DeepSpeed 功能互补。
    • 请注意,上述数据效率库提供了更通用的课程学习支持。此旧版课程学习功能仍然受支持,但我们建议使用数据效率库。
  • 渐进层下降
    • 高效且强大的压缩训练。
    • 预训练收敛速度提升高达 2.5 倍。
  • 性能分析和调试
  • 专家混合 (MoE)

title: “功能概述” layout: single permalink: /features/ toc: true toc_label: “内容” —

使用混合精度的分布式训练

混合精度训练

通过在 deepspeed_config JSON 文件中启用,实现 16 位(FP16)训练。

"fp16": {
    "enabled": true,
    "loss_scale": 0,
    "loss_scale_window": 1000,
    "hysteresis": 2,
    "consecutive_hysteresis": false,
    "min_loss_scale": 1
}

单 GPU、多 GPU 和多节点训练

通过使用主机文件指定资源,轻松地在单 GPU、单节点多 GPU 或多节点多 GPU 执行之间切换。

deepspeed --hostfile=<hostfile> \
	<client_entry.py> <client args> \
	--deepspeed --deepspeed_config ds_config.json

脚本 <client_entry.py> 将在 <hostfile> 中指定资源上执行。

流水线并行

DeepSpeed 提供了 流水线并行,以实现内存和通信效率高的训练。DeepSpeed 支持数据、模型和流水线并行的混合组合,并且已经扩展到 使用 3D 并行实现万亿参数。流水线并行还可以提高通信效率,并且在低带宽集群上将训练速度提高了高达 7 倍。

模型并行

支持自定义模型并行

DeepSpeed 支持所有形式的模型并行,包括基于张量切片的方案,例如 Megatron-LM。它只需要模型并行框架提供一个 _模型并行单元_ (mpu),该单元实现了一些簿记功能。

mpu.get_model_parallel_rank()
mpu.get_model_parallel_group()
mpu.get_model_parallel_world_size()

mpu.get_data_parallel_rank()
mpu.get_data_parallel_group()
mpu.get_data_parallel_world_size()

与 Megatron-LM 集成

DeepSpeed 与 Megatron 完全兼容。有关详细信息,请参阅 Megatron-LM 教程

零冗余优化器

零冗余优化器 (ZeRO) 是 DeepSpeed 的核心,它使得大模型训练能够在仅使用模型并行无法实现的规模上进行。启用 ZeRO 后,可以在没有模型并行的情况下训练超过 130 亿参数的模型,并且在当前一代硬件上,使用模型并行可以训练高达 2000 亿参数的模型。

有关更多详细信息,请参阅 ZeRO 论文GPT 教程,了解与 DeepSpeed 集成的信息。

优化器状态和梯度分区

ZeRO 中的优化器状态和梯度分区,通过将这些状态分布在数据并行进程中而不是复制它们,将模型状态(优化器状态、梯度和参数)的内存消耗减少了 8 倍,而标准数据并行则复制这些状态。

激活分区

激活分区是 ZeRO 中的一种内存优化,可以减少模型并行训练 (MP) 期间激活所消耗的内存。在 MP 中,某些激活可能需要所有 MP 进程,导致激活在 MP GPU 上复制。激活分区在正向传播中计算后,以分区状态存储这些激活。在反向传播期间,这些激活在再次需要之前被全部收集。通过以分区状态存储激活,DeepSpeed 中的 ZeRO 可以按 MP 度数减少激活内存占用。

常数缓冲区优化 (CBO)

CBO 能够实现高网络和内存吞吐量,同时将内存使用量限制在恒定大小。对于诸如归一化或 allreduce 集合之类的内存和网络受限操作,性能取决于操作数的大小。简单地将所有操作数融合成一个大型操作数,可以以不必要的内存开销为代价实现巨大的吞吐量。DeepSpeed 中的 CBO 将较小的操作数融合成一个预定义大小的缓冲区,该缓冲区足够大以实现高性能,而不会产生不必要的内存开销。

连续内存优化 (CMO)

CMO 减少了训练过程中的内存碎片,防止由于缺乏连续内存而导致的内存不足错误。内存碎片是短生命周期和长生命周期内存对象交错的结果。在正向传播期间,激活检查点是长生命周期的,而重新计算的激活是短生命周期的。类似地,在反向计算期间,激活梯度是短生命周期的,而参数梯度是长生命周期的。CMO 将激活检查点和参数梯度传输到连续缓冲区,防止内存碎片。

ZeRO-Offload

ZeRO-Offload 通过利用 GPU 和其主机 CPU 上的计算和内存资源,扩展了可以使用最少 GPU 资源高效训练的最大模型尺寸的界限。它允许在单个 NVIDIA V100 GPU 上训练高达 130 亿参数的模型,是现有技术的 10 倍,同时保持每 GPU 超过 30 千兆浮点运算的训练吞吐量。

有关更多详细信息,请参阅 ZeRO-Offload 发布博客教程,了解与 DeepSpeed 集成的信息。

其他内存和带宽优化

智能梯度累积

梯度累积允许在内存有限的情况下运行更大的批次大小,通过将有效批次分解成多个顺序微批次,并在这些微批次之间平均参数梯度。此外,不是在每个微批次中将所有 GPU 的梯度平均起来,而是在序列的每个步骤中局部平均梯度,并在序列结束时进行一次 allreduce,以生成所有 GPU 上有效批次的平均梯度。此策略显着减少了通信,而全局平均每个微批次的方法,尤其是当每个有效批次的微批次数量很大时。

通信重叠

在反向传播过程中,DeepSpeed 可以将平均已计算参数梯度所需的通信与正在进行的梯度计算重叠。这种计算-通信重叠使 DeepSpeed 即使在中等批次大小的情况下也能实现更高的吞吐量。

训练功能

简化的训练 API

DeepSpeed 核心 API 仅包含少量方法。

  • 初始化: initialize
  • 训练: backwardstep
  • 参数解析: add_config_arguments
  • 检查点: load_checkpointstore_checkpoint

DeepSpeed 通过使用这些 API 以及 deepspeed_config JSON 文件来启用和禁用功能,支持本文档中描述的大多数功能。有关更多详细信息,请参阅 核心 API 文档

激活检查点 API

DeepSpeed 的激活检查点 API 支持激活检查点分区、CPU 检查点、连续内存优化,同时还允许分层分析。有关更多详细信息,请参阅 核心 API 文档

梯度裁剪

{
  "gradient_clipping": 1.0
}

DeepSpeed 在幕后处理梯度裁剪,基于用户指定的最大梯度范数。有关更多详细信息,请参阅 核心 API 文档

混合精度自动损失缩放

DeepSpeed 在内部处理混合精度训练的损失缩放。损失缩放参数可以在 deepspeed_config JSON 文件中指定。有关更多详细信息,请参阅 核心 API 文档

训练优化器

1 位 Adam、0/1 Adam 和 1 位 LAMB 优化器,通信量减少高达 26 倍

DeepSpeed 有三个通信效率高的优化器,称为 1 位 Adam、0/1 Adam 和 1 位 LAMB。它们提供与 Adam/LAMB 相同的收敛速度,通信量减少了高达 26 倍,这使得 BERT-Large 预训练的吞吐量提高了高达 6.6 倍,而 SQuAD 微调在带宽有限的集群上的吞吐量提高了高达 2.7 倍。有关使用和性能的更多详细信息,请参阅 1 位 Adam 教程1 位 Adam 博客文章0/1 Adam 教程1 位 LAMB 教程。有关技术细节,请参阅 1 位 Adam 论文0/1 Adam 论文1 位 LAMB 论文

融合 Adam 优化器和任意 torch.optim.Optimizer

使用 DeepSpeed,用户可以选择使用 NVIDIA 的高性能 ADAM 实现,或任何扩展 torch 的 torch.optim.Optimizer 类的训练优化器。

CPU-Adam:Adam 的高性能矢量化实现

我们在 CPU 上引入了一种高效的 Adam 优化器实现,通过将参数更新性能提高了近一个数量级。我们在 CPU-Adam 实现中使用了 Intel-x86 架构上的 AVX SIMD 指令。我们支持 AVX-512 和 AVX-2 指令集。DeepSpeed 默认使用 AVX-2,可以通过设置构建标志 DS_BUILD_AVX512 为 1 来切换到 AVX-512,在安装 DeepSpeed 时。使用 AVX-512,考虑到模型大小在 10 亿到 100 亿参数之间,我们观察到与 torch-adam 相比,速度提升了 5.1 倍到 6.5 倍。

内存带宽优化的 FP16 优化器

混合精度训练由 DeepSpeed FP16 优化器处理。此优化器不仅处理 FP16 训练,而且效率很高。权重更新的性能主要由内存带宽决定,而实现的内存带宽取决于输入操作数的大小。FP16 优化器旨在通过将模型的所有参数合并到一个大型缓冲区中并在一个内核中应用权重更新来最大程度地提高可实现的内存带宽,从而实现高内存带宽。

使用 LAMB 优化器的超大批次训练

DeepSpeed 通过启用 LAMB 优化器,使使用大型批次大小进行训练变得容易。有关 LAMB 的更多详细信息,请参阅 LAMB 论文

使用 ZeRO 优化器进行内存高效训练

DeepSpeed 可以训练没有模型并行的最多 130 亿参数的模型,以及使用 16 路模型并行的最多 2000 亿参数的模型。通过 ZeRO 优化器实现的内存效率,使得这种模型尺寸的飞跃成为可能。有关更多详细信息,请参阅 ZeRO 论文

训练无关的检查点

无论您使用的是数据并行训练、模型并行训练、混合精度训练、这三者的混合,还是使用零优化器来启用更大的模型尺寸,DeepSpeed 都可以为您简化检查点。有关更多详细信息,请参阅 入门 指南和 核心 API 文档

DeepSpeed 支持多种学习率调度,以实现大型批次缩放的更快收敛。

学习率范围测试

请参阅 学习率范围测试 教程。

1 周期学习率计划

请参阅 1Cycle 学习率调度 教程。

简化的数据加载器

在数据加载方面,DeepSpeed 从用户那里抽象了数据并行和模型并行。用户只需提供 PyTorch 数据集,DeepSpeed 数据加载器就可以自动正确处理批次创建。

数据效率

请参阅 数据效率 教程。

课程学习

请参阅 课程学习 教程。请注意,上述数据效率库提供了更通用的课程学习支持。此旧版课程学习功能仍然受支持,但我们建议使用数据效率库。

性能分析和调试

DeepSpeed 提供了一套用于性能分析和调试的工具。

挂钟时间细分

DeepSpeed 提供了在训练的不同部分花费的时间的详细细分。可以通过在 deepspeed_config 文件中设置以下内容来启用它。

{
  "wall_clock_breakdown": true,
}

计时激活检查点函数

启用激活检查点后,可以在 deepspeed_config 文件中启用分析每个检查点函数的正向和反向时间。

{
  "activation_checkpointing": {
    "profile": true
  }
}

浮点运算分析器

DeepSpeed 的浮点运算量分析器测量 PyTorch 模型的运行时间、浮点运算量和参数,并显示哪些模块或层是瓶颈。当与 DeepSpeed 运行时一起使用时,可以在 deepspeed_config 文件中配置浮点运算量分析器,如下所示

{
  "flops_profiler": {
    "enabled": true,
    "profile_step": 1,
    "module_depth": -1,
    "top_modules": 3,
    "detailed": true,
    }
}

浮点运算量分析器也可以用作独立包。有关更多详细信息,请参阅 浮点运算量分析器 教程。

自动调优

DeepSpeed 自动调优器使用模型信息、系统信息和启发式算法,有效地调整 Zero 阶段、微批量大小和其他 Zero 配置。使用自动调优功能不需要 DeepSpeed 用户更改任何代码。虽然 "autotuning": {"enabled": true} 是启用自动调优的最小要求,但用户可以定义其他参数来配置自动调优过程。以下是自动调优配置中的主要参数及其默认值。有关更多详细信息,请参阅 自动调优 教程。

{
  "autotuning": {
    "enabled": true,
    "results_dir": null,
    "exps_dir": null,
    "overwrite": false,
    "metric": "throughput",
    "num_nodes": null,
    "num_gpus": null,
    "start_profile_step": 3,
    "end_profile_step": 5,
    "fast": true,
    "num_tuning_micro_batch_sizes": 3,
    "tuner_type": "model_based",
    "tuner_early_stopping": 5,
    "tuner_num_trials": 50,
    "arg_mappings": null
  }
}

浮点运算量分析器也可以用作独立包。有关更多详细信息,请参阅 浮点运算量分析器 教程。

监控

DeepSpeed 监控器将实时训练指标记录到一个或多个监控后端,包括 PyTorch 的 TensorBoardWandB 或简单的 CSV 文件。可以在 deepspeed_config 文件中使用一个或多个后端配置监控器,如下所示

{
  "tensorboard": {
    "enabled": true,
    "output_path": "output/ds_logs/",
    "job_name": "train_bert"
  }
  "wandb": {
    "enabled": true,
    "team": "my_team",
    "group": "my_group",
    "project": "my_project"
  }
  "csv_monitor": {
    "enabled": true,
    "output_path": "output/ds_logs/",
    "job_name": "train_bert"
  }
}

监控器还可以添加到日志自定义指标和客户端代码中。有关更多详细信息,请参阅 监控器 教程。

通信日志记录

DeepSpeed 提供了对 deepspeed.comm 中启动的所有通信操作的日志记录。可以在 deepspeed_config 文件中配置通信记录器,如下所示

{
  "comms_logger": {
    "enabled": true,
    "verbose": false,
    "prof_all": true,
    "debug": false
  }
}

然后,客户端代码可以通过调用 deepspeed.comm.log_summary() 来打印摘要。有关更多详细信息和示例用法,请参阅 通信日志记录 教程。

稀疏注意力

DeepSpeed 提供稀疏注意力来支持长序列。有关更多详细信息,请参阅 稀疏注意力 教程。

--deepspeed_sparse_attention
"sparse_attention": {
    "mode": "fixed",
    "block": 16,
    "different_layout_per_head": true,
    "num_local_blocks": 4,
    "num_global_blocks": 1,
    "attention": "bidirectional",
    "horizontal_global_attention": false,
    "num_different_global_patterns": 4
}

专家混合 (MoE)

要了解有关使用 DeepSpeed 训练专家混合模型的更多信息,请参阅我们的 教程 以获取更多详细信息。