跳转到主要内容

Modalities,一个用于大规模分布式和可重复的基座模型训练的PyTorch原生框架。

项目描述

Modalities是一个用于大规模分布式训练大型语言模型(LLMs)和基础模型(FMs)的PyTorch原生框架。鉴于分布式训练的复杂性和该领域的快速发展,我们旨在提供一个灵活且易于使用的框架,使研究人员和从业者能够高效地训练和评估LLMs和FMs。Modalities建立在PyTorch之上,利用分布式训练的最新进展,如完全分片数据并行(FSDP)、混合精度训练、Flash Attention等,以实现最先进的性能和吞吐量。

我们在两个高性能计算中心将Modalities扩展到了2048个GPU,分别是Leonardo BoosterMareNostrum 5,分别配备了Nvidia A100和H100 GPU。我们的扩展实验结果可以在这里找到。

除了可扩展性外,Modalities 允许无缝集成新的组件和功能,例如自定义注意力机制、损失函数、优化器或模型。我们提供了一系列教程,帮助您开始使用 Modalities 训练和评估模型。我们通过为每个组件类型(例如,模型、优化器等)提供清晰的接口来实现这种级别的可扩展性,组件必须实现这些接口才能在运行时在 Modalities 中注册。

入门指南

对于模型的训练和评估,您可以查看这个入门指南 链接,其中我们在 Redpajama V2 数据集的一个小子集上训练了一个小型、60M 参数的 GPT 模型。

安装

安装 Modalities 有两种方式。如果您想使用最新的夜间版本,或者想修改代码库本身,我们建议直接从源代码安装 Modalities。

如果您想将 Modalities 作为库使用,并使用 Modalities 注册您的自定义组件,您可以直接通过 pip 安装它,它为您提供了最新的稳定版本。

选项 1:从源代码安装

创建一个 conda 环境并通过以下方式激活它:

conda create -n modalities python=3.10
conda activate modalities

通过以下方式克隆仓库:

git clone git@github.com:Modalities/modalities.git

或者将仓库作为 zip 文件下载并解压。

wget https://github.com/Modalities/modalities/archive/refs/heads/main.zip
unzip main.zip

目前,在没有先安装 torch 的情况下无法安装 flash attention 依赖项。直到 flash attention 开发者修复此问题,我们必须运行以下命令:

pip install torch

之后,可以通过以下方式安装 Modalities:

cd modalities
pip install -e . 

选项 2:通过 pip 安装

要使用 pip 安装 Modalities,请运行

pip install torch
pip install modalities

注意,在这里,由于 flash attention 的依赖项管理,在安装 Modalities 之前也必须安装 torch。

使用

Modalities 提供了几个入口点与框架交互。以下部分列出了可用的入口点和它们相应的功能。

模型训练

对于模型预训练,我们必须传递一个配置文件,该文件指定了模型架构、优化器、数据集、数据加载器和其他训练组件。此外,我们还指定了节点数、每个节点的进程数和 rendezvous 端点。

示例

CUDA_VISIBLE_DEVICES=0,1,2,3 torchrun --rdzv-endpoint localhost:29515 \
                                        --nnodes 1 \
                                        --nproc_per_node 4 \
                                        $(which modalities) run --config_file_path configs/pretraining_config.yaml

说明

  • CUDA_VISIBLE_DEVICES=0,1,2,3:这个环境变量指定了将用于作业的 GPU。在上面的示例中,ID 为 0、1、2、3 的四个 GPU 被用于训练。

  • torchrun:这是 PyTorch 中的一个实用工具,用于启动分布式训练。它自动管理分布式训练中的多个进程。

  • --rdzv-endpoint localhost:29515:指定 rendezvous 端点。在这里,localhost 是机器的地址,29515 是端口。rendezvous 端点协调分布式训练中涉及的进程。

  • --nnodes 1:指定在分布式设置中使用的节点数。在上面的示例中,使用的是单个节点设置。

  • --nproc_per_node 4:这个参数告诉 torchrun 在每个节点上启动多少个进程。在上面的示例中,每个节点启动 4 个进程,对应于由 CUDA_VISIBLE_DEVICES 指定的 4 个 GPU(ID 为 0、1、2、3)。

  • $(which modalities) run:这部分动态查找 Modalities 可执行文件的路径并运行它。运行命令触发主进程以启动训练。

  • --config_file_path configs/pretraining_config.yaml:该参数提供了训练作业配置文件的路径。例如,上面给出的是 configs/pretraining_config.yaml。配置文件包含所有训练组件(例如,数据集、模型、优化器等)的全面参数化,使得训练可完全重现。示例配置文件可以在这里找到,Modalities中可用的组件完整列表可以在这里找到。

如果您是VSCode用户,可能需要将其添加到您的launch.json

        {
            "name": "Torchrun Main",
            "type": "python",
            "request": "launch",
            "module": "torch.distributed.run",
            "env": {
                "CUDA_VISIBLE_DEVICES": "0,1,2,3"
            },
            "args": [
                "--nnodes",
                "1",
                "--nproc_per_node",
                "4",
                "--rdzv-endpoint=0.0.0.0:29515",
                "src/modalities/__main__.py",
                "run",
                "--config_file_path",
                "config_files/pretraining_config.yaml",
            ],
            "console": "integratedTerminal",
            "justMyCode": true,
            "envFile": "${workspaceFolder}/.env"
        }

这将允许您直接从VSCode运行训练端点并对其进行调试。

原始训练数据集索引化

索引化过程的目标是确定原始数据文件中每个文档的起始字节位置和长度。随后,索引文件用于在分词期间有效地访问原始数据。

示例

modalities data create_raw_index --index_path data/preprocessed/fineweb_edu_num_docs_483606.idx \
                                               data/raw/fineweb_edu_num_docs_483606.jsonl

说明

modalities data create_raw_index命令触发了从原始数据创建索引的过程。--index_path参数指定了生成的索引文件将被保存的位置。在本例中,索引将被存储在data/preprocessed/fineweb_edu_num_docs_483606.idx。最后一部分,即data/raw/fineweb_edu_num_docs_483606.jsonl,是包含原始数据的JSONL(JSON Lines)格式的输入文件。该命令将处理此文件以创建索引。

原始训练数据集分词

分词是将原始文本数据转换为模型可以使用的标记序列的过程。分词需要一个配置文件,全面描述分词过程,使其可完全重现。示例分词配置可以在这里找到。

示例

modalities data pack_encoded_data configs/tokenization_config.yaml

推理

对于对模型检查点的推理,我们必须传递一个配置文件,该文件指定了完整的推理设置。示例推理配置可以在这里找到。

示例

modalities generate_text --config_file_path example_text_generation_config.yaml 

教程

尽管Modalities极大地简化了LLM训练,但仍有一些技术复杂性。我们提供了一系列教程,帮助您使用Modalities开始训练和评估模型。

  • Modalities 15分钟内完成
    在15分钟内使用Modalities训练密集模型

  • 入门指南
    通过在Redpajama V2数据集的微小子集上训练一个小型的GPT模型,简要概述如何开始使用Modalities。

  • Warmstart
    从检查点继续训练,例如在训练中断或崩溃后。

  • 库使用
    如何将Modalities作为库使用,并使用Modalities注册自定义组件。

支持的功能

以下列出Modalities最重要的功能。

吞吐量功能

名称 状态 描述
混合精度训练 支持 利用单精度(FP32)和半精度(FP16)浮点格式进行算术运算,同时保持模型精度,支持bf16。
完全分片数据并行(FSDP) 支持 通过将模型参数、梯度和优化器状态分片到所有GPU上优化分布式训练,减少内存开销,并能够训练更大的模型。
梯度累积 支持 允许使用比可能适合内存的更大的批处理大小,通过在更新模型权重之前累积多个小批次的梯度来实现。
FSDP通过FSDP进行CPU卸载 支持 将模型或计算的一部分从GPU移动到CPU或其他存储,以管理GPU内存限制。
使用Memmap进行高效的数据加载 支持 优化数据管道以减少I/O瓶颈。
激活检查点 支持 仅在正向传播的某些点上将中间激活保存到内存中,并在反向传播期间重新计算它们,以减少内存使用,但会增加额外的计算。
Flash Attention 支持 一种高度优化的注意力机制,显著降低了注意力计算的计算负担和内存占用,使大型模型能够实现更快的训练和推理。
张量并行 原型 通过垂直模型划分来实现,这是一种有效的模型并行技术。
序列并行 原型 张量并行的一种变体,它在序列维度上进行划分。
FSDP 2 原型 原始FSDP的改进版本。
Torch Compile 原型 通过即时编译(JIT)将张量操作编译成优化内核,从而加速张量操作。
延迟初始化 原型 不是在CPU RAM中实例化模型,而是将模块作为假张量实例化,并记录操作。一旦划分(例如,通过FSDP),每个秩仅通过回放张量操作来实例化本地张量。
自适应批量大小探索 计划中 在训练过程中动态增加训练批量大小,以确定给定GPU设置可以容纳的最大批量大小,而不会导致内存溢出或性能下降。
节点故障恢复 计划中 实现了自动检测和从分布式训练环境中的故障(例如,节点或GPU故障)恢复的机制,确保即使在集群中的一个或多个节点/GPU失败的情况下,训练也可以以最小的中断继续进行。
损失并行 计划中 通过在每个秩上本地计算损失来降低内存占用和通信开销。

下游性能特性

名称 状态 描述
SwiGLU 支持 一种非线性激活函数,将门控线性单元(GLU)与Swish相结合,以增强模型容量和学习效率。
权重衰减 支持 一种正则化技术,对权重大小施加惩罚,鼓励更小的权重以减少过拟合并提高泛化能力。
权重初始化 支持 在可配置的不同权重初始化技术之间进行选择,以稳定训练。
RMSNorm(预归一化) 支持 将层的预激活权重进行归一化以稳定训练,通常用作LayerNorm的替代品,以提高训练动态性。
旋转位置嵌入(RoPE) 支持 将序列位置信息编码到注意力机制中,保留相对位置信息,并提高模型对序列顺序的理解。
分组查询注意力(GQA) 支持 通过分组查询来增强注意力机制,以减少计算和内存占用,同时保持或提高性能。
学习率调度器 支持 根据预定义的调度(例如,步长衰减,指数衰减)调整训练期间的学习率,以改善收敛性和性能。
梯度裁剪 支持 通过将优化算法的梯度裁剪到最大值来防止梯度爆炸,从而稳定训练。
训练预热 支持 在训练的初始阶段逐渐将学习率从低值增加到高值,以稳定优化。
损失掩码 计划中 在损失函数中忽略或减少某些数据点的权重,通常用于具有可变长度序列的任务,例如忽略填充标记,或在更具体的用例中,如GAtt。
知识蒸馏 计划中 将知识从较大的、复杂的模型转移到较小的、更高效的模型,在不增加大型模型的计算成本的情况下提高较小模型的表现。
超参数优化 计划中 对各种超参数进行网格搜索,如LR、优化器参数等。µP的集成可能也很有趣。

扩展实验

以下是我们在一台高性能计算中心(HPC)进行的扩展实验结果,分别是Leonardo BoosterMareNostrum 5

在第一步中,我们探索了一组有限的配置(批量大小、梯度累积步骤等),以获得我们的基线结果。在第二步中,我们将专注于优化这些配置以最大化吞吐量。

Leonardo Booster - NVIDIA A100 64GB

参数(B) GPU数量 样本/秒 梯度累积 MBS GBS 序列长度 精度 分片 AC GPU类型 MFU
2.7 8 18.63 1 2 16 4096 BF_16 FULL_SHARD False A100 0.5847
2.7 8 18.43 1 2 16 4096 BF_16 HYBRID_SHARD False A100 0.5786
2.7 16 36.68 1 2 32 4096 BF_16 HYBRID_SHARD False A100 0.5757
2.7 16 36.96 1 2 32 4096 BF_16 FULL_SHARD False A100 0.58
2.7 32 72.63 1 2 64 4096 BF_16 HYBRID_SHARD False A100 0.5699
2.7 32 73.76 1 2 64 4096 BF_16 FULL_SHARD False A100 0.5788
2.7 64 146.12 1 2 128 4096 BF_16 FULL_SHARD False A100 0.5733
2.7 64 145.31 1 2 128 4096 BF_16 HYBRID_SHARD False A100 0.5701
2.7 128 285.64 1 2 256 4096 BF_16 HYBRID_SHARD False A100 0.5603
2.7 128 205.96 1 2 256 4096 BF_16 FULL_SHARD False A100 0.404
2.7 256 495.44 1 2 512 4096 BF_16 HYBRID_SHARD False A100 0.4859
2.7 256 303.17 1 2 512 4096 BF_16 FULL_SHARD False A100 0.2974
2.7 8 19.94 1 4 32 4096 BF_16 FULL_SHARD False A100 0.626
2.7 16 39.68 1 4 64 4096 BF_16 FULL_SHARD False A100 0.6227
2.7 32 78.3 1 4 128 4096 BF_16 FULL_SHARD False A100 0.6144
2.7 64 155.21 1 4 256 4096 BF_16 FULL_SHARD False A100 0.6089
2.7 128 303.76 1 4 512 4096 BF_16 FULL_SHARD False A100 0.5959
2.7 256 506.08 1 4 1024 4096 BF_16 FULL_SHARD False A100 0.4964
6.7 8 9.28 1 2 16 4096 BF_16 FULL_SHARD False A100 0.6867
6.7 16 18.35 1 2 32 4096 BF_16 FULL_SHARD False A100 0.6789
6.7 32 36.65 1 2 64 4096 BF_16 FULL_SHARD False A100 0.6782
6.7 64 72.72 1 2 128 4096 BF_16 FULL_SHARD False A100 0.6727
6.7 128 131.59 1 2 256 4096 BF_16 FULL_SHARD False A100 0.6086
6.7 256 225.24 1 2 512 4096 BF_16 FULL_SHARD False A100 0.5209

更多扩展结果可以在Leonardo 扩展实验中找到

MareNostrum 5 - NVIDIA H100 64GB

参数(B) GPU数量 样本/秒 梯度累积 MBS GBS 序列长度 精度 分片 AC GPU类型 MFU
2.7 4 15.06 1 2 8 4096 BF_16 FULL_SHARD False H100 0.2983
2.7 4 15.14 1 2 8 4096 BF_16 HYBRID_SHARD False H100 0.2998
2.7 8 29.6 1 2 16 4096 BF_16 HYBRID_SHARD False H100 0.2931
2.7 8 29.75 1 2 16 4096 BF_16 FULL_SHARD False H100 0.2946
2.7 16 58.7 1 2 32 4096 BF_16 HYBRID_SHARD False H100 0.2906
2.7 16 59.61 1 2 32 4096 BF_16 FULL_SHARD False H100 0.2951
2.7 32 117.07 1 2 64 4096 BF_16 HYBRID_SHARD False H100 0.2898
2.7 32 117.62 1 2 64 4096 BF_16 FULL_SHARD False H100 0.2912
2.7 64 235.96 1 2 128 4096 BF_16 FULL_SHARD False H100 0.292
2.7 64 234.65 1 2 128 4096 BF_16 HYBRID_SHARD False H100 0.2904
2.7 128 455.87 1 2 256 4096 BF_16 FULL_SHARD False H100 0.2821
2.7 256 883.07 1 2 512 4096 BF_16 FULL_SHARD False H100 0.2732
2.7 512 1831.71 1 2 1024 4096 BF_16 HYBRID_SHARD False H100 0.2834
2.7 512 1365.31 1 2 1024 4096 BF_16 FULL_SHARD False H100 0.2112
2.7 1024 1105.99 1 2 2048 8192 BF_16 FULL_SHARD False H100 0.2071
2.7 1024 3618.0 1 2 2048 4096 BF_16 HYBRID_SHARD False H100 0.2799
28 16 2.9 1 1 16 8192 BF_16 FULL_SHARD True H100 0.2998
28 32 5.53 1 1 32 8192 BF_16 FULL_SHARD True H100 0.2863
28 64 11.61 1 1 64 8192 BF_16 FULL_SHARD True H100 0.3003
28 128 22.95 1 1 128 8192 BF_16 FULL_SHARD True H100 0.2968
28 256 44.22 1 1 256 8192 BF_16 FULL_SHARD True H100 0.286
28 512 87.36 1 1 512 8192 BF_16 FULL_SHARD True H100 0.2825
28 512 87.56 1 1 512 8192 BF_16 FULL_SHARD True H100 0.2831
28 1024 162.16 1 1 1024 8192 BF_16 FULL_SHARD True H100 0.2622
28 2048 297.0 1 1 2048 8192 BF_16 FULL_SHARD True H100 0.2401

更多扩展结果可以在MareNostrum5 扩展实验中找到

Scaling Plot for a 28B model with a sequence length of 8192 tokens

贡献

Modalities 欢迎您的贡献!请查看我们有关格式、测试等方面的贡献指南


非常感谢所有我们出色的贡献者!

项目详情


下载文件

下载适合您平台的文件。如果您不确定选择哪个,请了解更多关于安装包的信息。

源分布

modalities-0.3.0.tar.gz (118.7 kB 查看哈希值)

上传时间

构建分布

modalities-0.3.0-py3-none-any.whl (135.9 kB 查看哈希值)

上传时间 Python 3

由以下机构支持

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF 赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误日志 StatusPage StatusPage 状态页面