培训概述和特点

概述

训练先进的深度学习模型具有挑战性。除了模型设计之外,模型科学家还需要设置最先进的训练技术,如分布式训练、混合精度、梯度累积和检查点。然而,科学家可能仍然无法达到预期的系统性能和收敛速度。大型模型更具挑战性:大型模型在纯数据并行的情况下很容易耗尽内存,并且难以使用模型并行。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 GPUs DeepSpeed 44 分钟
    256 V100 GPUs DeepSpeed 2.4 小时
    64 V100 GPUs DeepSpeed 8.68 小时
    16 V100 GPUs DeepSpeed 33.22 小时

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

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

    阅读更多: GPT教程

内存效率

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

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

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

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

可扩展性

DeepSpeed 支持高效的数据并行、模型并行、管道并行及其组合,我们称之为3D并行。

  • DeepSpeed的3D并行性提供了系统支持,可以运行具有数万亿参数的模型,更多信息请阅读我们的新闻稿教程
  • DeepSpeed 可以更高效地运行大型模型,对于规模从 1.5B 到数百亿不等的模型,速度提升可达 10 倍。 更具体地说,由 ZeRO 提供支持的数据并行是互补的,并且可以与不同类型的模型并行结合使用。这使得 DeepSpeed 能够以较低的模型并行度和较高的批量大小来适应模型,与单独使用模型并行相比,提供了显著的性能提升。

    阅读更多: ZeRO 论文, 和 GPT 教程.

DeepSpeed Speedup

该图展示了DeepSpeed(结合了ZeRO驱动的数据并行与NVIDIA Megatron-LM的模型并行)相较于单独使用Megatron-LM在系统吞吐量上的改进。

通信效率

DeepSpeed的管道并行性在分布式训练期间减少了通信量,这使得用户可以在网络带宽有限的集群上以2-7倍的速度训练数十亿参数的模型。 Low-bandwidth GPT-2 Performance

1-bit Adam、0/1 Adam 和 1-bit LAMB 将通信量减少了多达 26 倍,同时实现了与 Adam 相似的收敛效率,允许扩展到不同类型的 GPU 集群和网络。1-bit Adam 博客文章1-bit Adam 教程0/1 Adam 教程1-bit LAMB 教程

数据效率

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

支持长序列长度

DeepSpeed 提供了稀疏注意力内核——这是一项关键技术,用于支持长序列的模型输入,无论是文本、图像还是声音。与经典的密集 Transformer 相比,它能够支持数量级更长的输入序列,并在保持相当准确性的情况下,执行速度提升高达 6 倍。它还优于最先进的稀疏实现,执行速度快 1.5 到 3 倍。此外,我们的稀疏内核支持灵活稀疏格式的高效执行,并赋予用户在自定义稀疏结构上进行创新的能力。阅读更多

快速收敛以实现高效

DeepSpeed 支持高级超参数调优和大批量优化器,如 LAMB。这些功能提高了模型训练的效率,并减少了达到所需精度所需的样本数量。

阅读更多: Tuning tutorial.

良好的可用性

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

功能

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


标题: “功能概述” 布局: 单页 永久链接: /features/ 目录: 真 目录标签: “内容” —

使用混合精度进行分布式训练

混合精度训练

通过在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和多节点训练

通过使用hostfile指定资源,可以轻松在单GPU、单节点多GPU或多节点多GPU执行之间切换。

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

脚本 将在 中指定的资源上执行。

管道并行

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论文,以及关于与DeepSpeed集成的GPT教程

优化器状态和梯度分区

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

激活分区

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

常量缓冲区优化 (CBO)

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

连续内存优化 (CMO)

CMO 在训练过程中减少了内存碎片,防止由于缺乏连续内存而导致的内存不足错误。内存碎片是短期和长期内存对象交错的结果。在前向传播过程中,激活检查点是长期存在的,但重新计算的激活是短期存在的。同样,在后向计算过程中,激活梯度是短期存在的,而参数梯度是长期存在的。CMO 将激活检查点和参数梯度转移到连续缓冲区,防止内存碎片。

ZeRO-卸载

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-bit Adam、0/1 Adam 和 1-bit LAMB 优化器,通信量减少高达 26 倍

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

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

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

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

我们介绍了一种在CPU上高效实现的Adam优化器,该实现将参数更新性能提高了近一个数量级。我们在Intel-x86架构上使用AVX SIMD指令来实现CPU-Adam。我们支持AVX-512和AVX-2指令集。DeepSpeed默认使用AVX-2,可以通过在安装DeepSpeed时将构建标志DS_BUILD_AVX512设置为1来切换到AVX-512。使用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 数据加载器可以自动适当地处理批次的创建。

数据效率

请参考数据效率教程。

课程学习

请参考Curriculum Learning教程。请注意,上面的数据效率库提供了更通用的课程学习支持。这个传统的课程学习功能仍然支持,但我们建议使用数据效率库。

性能分析与调试

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

挂钟时间分解

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

{
  "wall_clock_breakdown": true,
}

定时激活检查点函数

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

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

浮点运算分析器

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

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

flops分析器也可以作为一个独立的包使用。更多详情请参考Flops Profiler教程。

自动调优

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

{
  "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
  }
}

flops分析器也可以作为一个独立的包使用。更多详情请参考Flops Profiler教程。

监控

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"
  }
}

Monitor 也可以添加到日志自定义指标和客户端代码中。请参阅 Monitor 教程以获取更多详细信息。

通信日志

DeepSpeed 提供了记录所有在 deepspeed.comm 中启动的通信操作的功能。通信记录器可以在 deepspeed_config 文件中进行如下配置:

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

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

稀疏注意力

DeepSpeed 提供稀疏注意力以支持长序列。请参考 Sparse Attention 教程。

--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训练专家混合(MoE)模型的信息,请参阅我们的教程以获取更多详情。