DeepSpeed:推动深度学习优化与创新

809 阅读8分钟

在人工智能的浪潮中,深度学习模型正以前所未有的速度和规模发展,它们在图像识别、自然语言处理等多个领域展现出惊人的潜力。然而,随着模型的复杂度增加,训练和部署这些巨兽级模型的挑战也日益凸显。微软 DeepSpeed 的诞生,正是为了打破这些限制,它不仅优化了深度学习模型的训练和推理过程,更以其创新的四大支柱技术,为 AI 的未来铺平了道路。本文将深入探讨 DeepSpeed 如何重新定义深度学习的可能性,以及它对整个 AI 行业的深远影响。

DeepSpeed 简介

DeepSpeed 是由 Microsoft 开发的深度学习优化库,它重新定义了大规模模型的训练和推理的可能性。这个先进的软件套件旨在处理极端规模和速度的深度学习 (DL) 任务,为包含数十亿甚至数万亿参数的模型的训练和部署提供便利。

image.png

DeepSpeed的功能丰富多样。它能够更高效地训练和推断大型模型,减少所需的计算和内存资源。这是通过系统吞吐量优化、跨数千个 GPU 的可扩展性以及在资源受限系统上运行的能力来实现的。此外,DeepSpeed 通过减少延迟、提高吞吐量和采用模型压缩技术来优化推断过程,从而最小化大小和计算开销。

DeepSpeed 软件套件将 DeepSpeed 库的核心创新功能打包成一个可访问和开源的存储库。该套件包括 DeepSpeed 库、推理模型实现(MII)以及在 Azure 上的部署支持,使其具有多样性和用户友好性。该库在深度学习界被广泛采用,促进了目前存在的最强大的 AI 模型的训练。

DeepSpeed 四支柱

DeepSpeed 是基于四个创新支柱构建的,每个支柱都涉及深度学习优化的不同方面。

image.png

DeepSpeed-Training

这个支柱专注于提高大规模深度学习训练的效率和可用性。它包括诸如 ZeRO、3D-Parallelism、DeepSpeed-MoE(混合专家模型)和 ZeRO-Infinity 等技术,为大型模型的有效高效训练做出贡献。

DeepSpeed-Inference

它集合了各种并行技术的创新,例如张量并行、流水线并行、专家并行和 ZeRO 并行。这些与高性能的自定义推断内核和通信优化相结合,实现可扩展和高效的推断。

DeepSpeed-Compression

DeepSpeed 的这一方面专注于模型压缩,进一步提高推理效率,提供可使研究人员减小模型尺寸而不显著影响性能的技术。ZeroQuant 和 XTC 等最先进的创新是这一支柱下的显著贡献。

DeepSpeed4Science

旨在通过人工智能系统技术创新建立独特的能力,帮助领域专家揭示今天最大的科学之谜,支持领域专家解决复杂的科学挑战。

DeepSpeed 初体验

DeepSpeed 已经被用于训练各种大规模模型,包括 Megatron-Turing NLG (530B),Jurassic-1 (178B),BLOOM (176B) 和其他几个模型。这种广泛采用充分说明了 DeepSpeed 处理大规模模型训练任务的能力和高效性。

安装

DeepSpeed 支持 Python 语言,将 DeepSpeed 集成到工作流程之前,请确保拥有兼容的环境。DeepSpeed 设计与基于 Linux 的系统配合使用,并且需要 Python(3.6 或更新版本),PyTorch(1.6 或更新版本)以及如果使用 NVIDIA GPU,则需要 CUDA。使用 pip 安装 DeepSpeed :

pip install deepspeed

初始化和配置

使用 DeepSpeed 前,首先在训练脚本中初始化 DeepSpeed。DeepSpeed 的初始化过程涉及用其引擎包装模型和优化器,从而自动将计算分布到可用的 GPU 上并优化训练过程。

需要创建一个 DeepSpeed 配置文件,通常是一个 JSON 文件,指定各种参数和优化,例如梯度积累、精确度训练设置和模型并行配置。参考如下:

{
  "train_batch_size": 16,
  "train_micro_batch_size_per_gpu": 4,
  "gradient_accumulation_steps": 1,
  "wall_clock_breakdown": {
    "batch": 0.9,
    "compute_loss": 0.1,
    "backward": 0.05,
    "optimizer": 0.05
  },
  "zero_optimization": {
    "stage": 1,
    "allgather_partitions": true,
    "allgather_bucket_size": 2e8,
    "overlap_comm": true,
    "reduce_scatter": true,
    "reduce_bucket_size": 2e8,
    "contiguous_gradients": true,
    "cpu_offload": true
  },
  "fp16": {
    "enabled": true,
    "loss_scale": 0,
    "initial_scale_power": 32,
    "loss_scale_window": 1000
  },
  "optimizer": {
    "type": "Adam",
    "params": {
      "lr": 3e-5,
      "betas": [
        0.9,
        0.999
      ],
      "eps": 1e-8,
      "weight_decay": 3e-7
    }
  },
  "scheduler": {
    "type": "WarmupLR",
    "params": {
      "warmup_min_lr": 0,
      "warmup_max_lr": 3e-5,
      "warmup_num_steps": 100
    }
  },
  "activation_checkpoint_interval": 1,
  "clip_grad": 1.0,
  "find_unused_parameters": true,
  "contiguous_memory_optimization": false,
  "offload_optimizer": {
    "device": "cpu",
    "pin_memory": true
  },
  "debug": false,
  "log_interval": 10,
  "save_interval": 100,
  "save_ckpt_path": "/path/to/save/checkpoint",
  "load_ckpt_path": "/path/to/load/checkpoint"
}

与模型集成

在定义了模型和优化器之后,可以按如下方式集成 DeepSpeed:

model_engine, optimizer, _, _ = deepspeed.initialize(args=arg_parser,
                                 model=model
                                , model_parameters=model.parameters())

DeepSpeed 引擎被初始化,它可以使用三个简单的 API 进行模型的前向传播(可调用对象)、反向传播( backward )和权重更新( step )进行训练。

DeepSpeed 引擎被初始化,它可以使用三个简单的 API 进行模型的前向传播(可调用对象)、反向传播( backward )和权重更新( step )进行训练。

for step, batch in enumerate(data_loader):
    #forward() method
    loss = model_engine(batch)

    #runs backpropagation
    model_engine.backward(loss)

    #weight update
    model_engine.step()

创建检查点

通过 DeepSpeed 中的 save_checkpoint 和 load_checkpoint API 处理保存和加载训练状态,它们需要 2 个参数来唯一标识一个检查点:

  • ckpt_dir:用于保存检查点的目录。
  • ckpt_id:在目录中唯一标识检查点的标识符。在下面的代码片段中,我们使用损失值作为检查点标识符。
# 加载检查点
_, client_sd = model_engine.load_checkpoint(args.load_dir, args.ckpt_id)
step = client_sd['step']


# 将数据加载器提前到 ckpt 步骤
dataloader_to_step(data_loader, step + 1)

for step, batch in enumerate(data_loader):
    #forward() method
    loss = model_engine(batch)
    #runs backpropagation
    model_engine.backward(loss)
    #weight update
    model_engine.step()
    #save checkpoint
    if step % args.save_interval:
        client_sd['step'] = step
        ckpt_id = loss.item()
        model_engine.save_checkpoint(args.save_dir
                                    , ckpt_id
                                    , client_sd = client_sd)

训练循环修改

使用 DeepSpeed 不再直接调用模型的前向传播和反向传播,而是使用 DeepSpeed 引擎(上面示例中的 model_engine )来管理这些过程。DeepSpeed 接管了训练步骤的执行和优化,高效地管理资源并跨多个 GPU 进行扩展。

大型模型的高级功能

DeepSpeed 提供了几个专门为大型模型训练设计的高级功能。

  • ZeRO-Offload:通过将模型的某些部分转移到 CPU 来优化内存使用,使得在内存有限的 GPU 上训练更大的模型成为可能。
  • Pipeline Parallelism:将模型在不同的 GPU 上分割,减少每个 GPU 上的内存占用,并允许模型片段的并行执行。
  • Sparse Attention:通过减少计算复杂性,优化处理长序列的过程,特别适用于处理长序列数据的 Transformer 等模型。

通过利用这些功能,即使在资源有限的硬件上,也可以更有效地训练大型语言模型。

运行训练

一切准备就绪后,可以开始训练,DeepSpeed 的优化同时也在起作用。DeepSpeed 负责分配和优化计算任务,使大规模模型训练更高效。

此外,DeepSpeed 允许将模型的分布式训练限制在可用节点和 GPU 的子集上。通过两个命令行参数 --num_nodes 和 --num_gpus 启用此功能。例如,可以使用以下命令将分布式训练限制为仅使用两个节点:

deepspeed --num_nodes=2 <client_entry.py> <client args> --deepspeed --deepspeed_config ds_config.json

DeepSpeed 前景

DeepSpeed 正在蓬勃发展,旨在增强其能力并将其整合到人工智能研究和开发生态系统中。随着它不断迭代,DeepSpeed 预计将在推进人工智能领域,推动越来越复杂和大规模模型的创建和部署,发挥关键作用。

Microsoft DeepSpeed 不仅仅是一个用于深度学习的优化库;它是一个全面的套件,正在重塑人工智能和机器学习的格局。其对模型训练和推理的深远影响,结合其可扩展性和效率,使 DeepSpeed 成为迈向先进 AI 解决方案的关键工具。随着技术的不断发展,DeepSpeed 在实现新的 AI 能力和支持科学发现方面的作用预计将不断增长,标志着人工智能研究和应用领域的重要轨迹。

结语

随着DeepSpeed的不断发展,我们见证了AI领域中一项革命性的进步。它不仅提高了模型训练的效率,降低了资源消耗,更通过一系列创新技术,让大规模模型的构建和应用成为可能。DeepSpeed的未来充满希望,它将继续作为AI研究和应用的加速器,推动科学发现,促进技术创新。在AI不断演进的征途上,DeepSpeed不仅是一个工具,更是一个引领者,预示着智能科技更加辉煌的明天。