Project Icon

BMTrain

分布式大规模深度学习模型训练优化工具

BMTrain是一款为大规模深度学习模型设计的分布式训练工具。它能够支持训练包含数十亿参数的模型,并保持代码简洁性。该工具集成了ZeRO优化和通信优化等技术,可提高训练效率和显存利用率。BMTrain与PyTorch兼容,仅需少量代码调整即可实现分布式训练。在13B参数的GPT-2模型训练中,BMTrain展现出优越性能。

BMTrain

高效的大模型训练工具

概述文档安装使用性能简体中文

文档状态 GitHub release (最新by日期包括预发布) GitHub

最新动态

  • 2024/02/26 BMTrain 1.0.0 发布。代码重构和张量并行支持。详见更新日志
  • 2023/08/17 BMTrain 0.2.3 发布。详见更新日志
  • 2022/12/15 BMTrain 0.2.0 发布。详见更新日志
  • 2022/06/14 BMTrain 0.1.7 发布。支持ZeRO-2优化!
  • 2022/03/30 BMTrain 0.1.2 发布。适配OpenPromptOpenDelta
  • 2022/03/16 BMTrain 0.1.1 公开发布第一个稳定版本,修复了测试版中的许多错误。
  • 2022/02/11 BMTrain 0.0.15 公开发布第一个测试版。

概述

BMTrain是一个高效的大模型训练工具包,可用于训练具有数百亿参数的大模型。它可以以分布式方式训练模型,同时保持代码像单机训练一样简单。

文档

我们的文档提供了关于该软件包的更多信息。

安装

  • 通过pip(推荐):pip install bmtrain

  • 从源代码:下载软件包并运行pip install .

安装BMTrain可能需要几分钟到十几分钟,因为它需要在安装时编译c/cuda源代码。 我们建议直接在训练环境中编译BMTrain,以避免不同环境可能引起的潜在问题。

使用

步骤1:初始化BMTrain

在使用BMTrain之前,您需要在代码开头对其进行初始化。就像使用PyTorch的分布式模块需要在代码开头使用init_process_group一样,使用BMTrain需要在代码开头使用init_distributed

import bmtrain as bmt
bmt.init_distributed(
    seed=0,
    # ...
)

注意: 在使用BMTrain时,不要使用PyTorch的分布式模块及其相关通信函数。

步骤2:启用ZeRO优化

要启用ZeRO优化,您需要对原始模型代码进行一些简单的替换。

  • torch.nn.Module -> bmtrain.DistributedModule
  • torch.nn.Parameter -> bmtrain.DistributedParameter

并用bmtrain.Block包装transformer块。

这里有一个例子。

原始代码

import torch
class MyModule(torch.nn.Module):
    def __init__(self):
        super().__init__()
        self.param = torch.nn.Parameter(torch.empty(1024))
        self.module_list = torch.nn.ModuleList([
            SomeTransformerBlock(),
            SomeTransformerBlock(),
            SomeTransformerBlock()
        ])
    
    def forward(self):
        x = self.param
        for module in self.module_list:
            x = module(x, 1, 2, 3)
        return x

替换后的代码

import torch
import bmtrain as bmt
class MyModule(bmt.DistributedModule): # 此处改变
    def __init__(self):
        super().__init__()
        self.param = bmt.DistributedParameter(torch.empty(1024)) # 此处改变
        self.module_list = torch.nn.ModuleList([
            bmt.Block(SomeTransformerBlock(), zero_level=3), # 此处改变,现在支持2和3
            bmt.Block(SomeTransformerBlock(), zero_level=3), # 此处改变,现在支持2和3
            bmt.Block(SomeTransformerBlock(), zero_level=3)  # 此处改变,现在支持2和3
        ])
    
    def forward(self):
        x = self.param
        for module in self.module_list:
            x = module(x, 1, 2, 3)
        return x
    

步骤3:启用通信优化

为进一步减少额外的通信开销并将通信与计算时间重叠,可以使用TransformerBlockList进行优化。

您可以通过对代码进行以下替换来启用它们:

  • torch.nn.ModuleList -> bmtrain.TransformerBlockList
  • for module in self.module_list: x = module(x, ...) -> x = self.module_list(x, ...)

原始代码

import torch
import bmtrain as bmt
class MyModule(bmt.DistributedModule):
    def __init__(self):
        super().__init__()
        self.param = bmt.DistributedParameter(torch.empty(1024))
        self.module_list = torch.nn.ModuleList([
            bmt.Block(SomeTransformerBlock()),
            bmt.Block(SomeTransformerBlock()),
            bmt.Block(SomeTransformerBlock())
        ])
    
    def forward(self):
        x = self.param
        for module in self.module_list:
            x = module(x, 1, 2, 3)
        return x
    

替换后的代码

import torch
import bmtrain as bmt
class MyModule(bmt.DistributedModule):
    def __init__(self):
        super().__init__()
        self.param = bmt.DistributedParameter(torch.empty(1024))
        self.module_list = bmt.TransformerBlockList([ # 此处改变
            bmt.Block(SomeTransformerBlock()),
            bmt.Block(SomeTransformerBlock()),
            bmt.Block(SomeTransformerBlock())
        ])
    
    def forward(self):
        x = self.param
        for module in self.module_list:
            x = module(x, 1, 2, 3)
        return x
    

步骤4:启动分布式训练

BMTrain使用与PyTorch分布式模块相同的启动命令。

您可以根据您的PyTorch版本选择其中一种。

  • ${MASTER_ADDR} 表示主节点的IP地址。
  • ${MASTER_PORT} 表示主节点的端口。
  • ${NNODES} 表示节点总数。
  • ${GPU_PER_NODE} 表示每个节点的GPU数量。
  • ${NODE_RANK} 表示此节点的排名。

torch.distributed.launch

$ python3 -m torch.distributed.launch --master_addr ${MASTER_ADDR} --master_port ${MASTER_PORT} --nproc_per_node ${GPU_PER_NODE} --nnodes ${NNODES} --node_rank ${NODE_RANK} train.py

torchrun

$ torchrun --nnodes=${NNODES} --nproc_per_node=${GPU_PER_NODE} --rdzv_id=1 --rdzv_backend=c10d --rdzv_endpoint=${MASTER_ADDR}:${MASTER_PORT} train.py

有关更多信息,请参阅文档

示例

我们提供了一个基于BMTrain的GPT-2训练示例。 代码主要由以下部分组成。

第1部分:模型定义

├── layers
│   ├── attention.py
│   ├── embedding.py
│   ├── feedforward.py
│   ├── __init__.py
│   ├── layernorm.py
│   └── linear.py
└── models
    ├── gpt.py
    └── __init__.py

上面是模型定义部分的代码目录结构。

我们定义了GPT-2所需的所有层,并使用BMTrain的DistributedModuleDistributedParameter来启用ZeRO优化。

第2部分:BMTrain初始化

bmtrain.init_distributed(seed=0)

model = GPT(
    num_layers=8,
    vocab_size=10240, 
    dim_model=2560,
    dim_head=80,
    num_heads=32,
    dim_ff=8192,
    max_distance=1024,
    bias=True,
    dtype=torch.half
)

bmtrain.init_parameters(model) # 或使用`bmtrain.load`加载检查点

# ... 其他初始化(数据集)...

bmtrain.init_distributed(seed=0)用于初始化分布式训练环境并设置随机种子以确保可重现性。

bmtrain.init_parameters(model)用于初始化模型的分布式参数。

第3部分:优化器和学习率调度器的初始化

loss_func = torch.nn.CrossEntropyLoss(ignore_index=-100)
optimizer = bmtrain.optim.AdamOffloadOptimizer(model.parameters(), weight_decay=1e-2)
lr_scheduler = bmtrain.lr_scheduler.Noam(optimizer, start_lr=1e-3, warmup_iter=40, end_iter=1000, num_iter=0)

BMTrain支持所有PyTorch原生优化器和损失函数,您还可以使用BMTrain提供的融合优化器进行混合精度训练。

此外,BMTrain还在bmtrain.lr_scheduler模块中提供了常用的学习率调度器。

第4部分:训练循环

# 创建优化器管理器的新实例
optim_manager = bmtrain.optim.OptimManager(loss_scale=1024)
# 让优化器管理器处理所有的优化器和(可选的)对应的学习率调度器
optim_manager.add_optimizer(optimizer, lr_scheduler)
# add_optimizer可以多次调用以添加其他优化器

for iteration in range(1000):
    # ... 为每个进程加载数据 ...

    # 前向传播和计算损失
    pos = torch.arange(enc_input.size(1)).long().cuda().repeat(enc_input.size(0), 1)
    logits = model(
        enc_input,
        pos,
        pos < enc_length[:, None]
    )
    batch, seq_len, vocab_out_size = logits.size()

    loss = loss_func(logits.view(batch * seq_len, vocab_out_size), targets.view(batch * seq_len))
    
    global_loss = bmtrain.sum_loss(loss).item() # 汇总所有进程的损失。这仅用于训练日志

    # 梯度清零
    optim_manager.zero_grad() # 为每个优化器调用zero_grad

    # 损失缩放和反向传播
    optim_manager.backward(loss)

    # 梯度裁剪
    grad_norm = optim_manager.clip_grad_norm(optimizer.param_groups, max_norm=1.0)

    # 优化器步进
    optim_manager.step()

    # ... 保存检查点或打印日志 ...

训练循环部分会稍长一些,但就像普通的训练循环一样,你不需要对分布式训练做太多适配。

你可以根据代码中的注释了解每个代码部分的功能。

唯一需要额外注意的是optimizer。使用BMTrain后,优化器中的一些细节需要调整。我们已经在optim_manager中实现了所有需要的细节。你只需要让optim_manager通过add_optimizer处理所有的优化器,并让optim_manager代替执行zero_grad()backward()clip_grad_norm()step()

如果你不使用混合精度训练,可以在不使用loss_scale的情况下进行训练。只需在OptimManager__init__函数中将loss_scale设置为None(OptimManager(loss_scale=None)),这也是默认设置。

如果你使用混合精度训练,损失缩放是混合精度训练中广泛使用的技术,用于防止梯度下溢。通过使用optim_manager.backward(loss)在反向传播前缩放loss,并在OptimManager__init__函数中将loss_scale设置为某个浮点数。在训练过程中,loss_scale会根据梯度自适应调整。

性能

我们使用4台服务器(每台服务器配备8个V100 GPU)训练了一个130亿参数的GPT-2模型,并测量了训练过程中每个GPU的吞吐量(每个GPU每秒处理的样本数)。

模型结构:

  • 40层
  • 128个注意力头
  • 5120隐藏维度
  • 512序列长度
批次大小8162432
BMTrain24.1526.9429.4228.28
ZeRO3(mp=1)14.8821.6924.38-
ZeRO3(mp=4)15.51---
ZeRO3(mp=8)15.51---
ZeRO2(mp=1)----
ZeRO2(mp=4)22.85---
ZeRO2(mp=8)21.33---

ZeROa(mp=b) 表示DeepSpeed + Megatron ZeRO阶段a和模型并行度 = b。

表格中的**-**表示内存不足。

支持的模型

我们已经将自然语言处理中大多数常见模型迁移到了BMTrain。你可以在ModelCenter仓库中找到支持的模型列表。

社区

我们欢迎每个人按照我们的贡献指南贡献代码。

你也可以在其他平台上找到我们:

许可证

该软件包基于Apache 2.0许可证发布。

其他说明

BMTrain对PyTorch进行了底层更改,因此如果你的程序输出意外结果,可以在issue中提交相关信息。

项目侧边栏1项目侧边栏2
推荐项目
Project Cover

豆包MarsCode

豆包 MarsCode 是一款革命性的编程助手,通过AI技术提供代码补全、单测生成、代码解释和智能问答等功能,支持100+编程语言,与主流编辑器无缝集成,显著提升开发效率和代码质量。

Project Cover

AI写歌

Suno AI是一个革命性的AI音乐创作平台,能在短短30秒内帮助用户创作出一首完整的歌曲。无论是寻找创作灵感还是需要快速制作音乐,Suno AI都是音乐爱好者和专业人士的理想选择。

Project Cover

白日梦AI

白日梦AI提供专注于AI视频生成的多样化功能,包括文生视频、动态画面和形象生成等,帮助用户快速上手,创造专业级内容。

Project Cover

有言AI

有言平台提供一站式AIGC视频创作解决方案,通过智能技术简化视频制作流程。无论是企业宣传还是个人分享,有言都能帮助用户快速、轻松地制作出专业级别的视频内容。

Project Cover

Kimi

Kimi AI助手提供多语言对话支持,能够阅读和理解用户上传的文件内容,解析网页信息,并结合搜索结果为用户提供详尽的答案。无论是日常咨询还是专业问题,Kimi都能以友好、专业的方式提供帮助。

Project Cover

讯飞绘镜

讯飞绘镜是一个支持从创意到完整视频创作的智能平台,用户可以快速生成视频素材并创作独特的音乐视频和故事。平台提供多样化的主题和精选作品,帮助用户探索创意灵感。

Project Cover

讯飞文书

讯飞文书依托讯飞星火大模型,为文书写作者提供从素材筹备到稿件撰写及审稿的全程支持。通过录音智记和以稿写稿等功能,满足事务性工作的高频需求,帮助撰稿人节省精力,提高效率,优化工作与生活。

Project Cover

阿里绘蛙

绘蛙是阿里巴巴集团推出的革命性AI电商营销平台。利用尖端人工智能技术,为商家提供一键生成商品图和营销文案的服务,显著提升内容创作效率和营销效果。适用于淘宝、天猫等电商平台,让商品第一时间被种草。

Project Cover

AIWritePaper论文写作

AIWritePaper论文写作是一站式AI论文写作辅助工具,简化了选题、文献检索至论文撰写的整个过程。通过简单设定,平台可快速生成高质量论文大纲和全文,配合图表、参考文献等一应俱全,同时提供开题报告和答辩PPT等增值服务,保障数据安全,有效提升写作效率和论文质量。

投诉举报邮箱: service@vectorlightyear.com
@2024 懂AI·鲁ICP备2024100362号-6·鲁公网安备37021002001498号