llm-analysis
训练和推理期间变压器模型的延迟和内存分析
概述
在论文、博客等文献中,有许多关于计算大型语言模型(LLMs)或变压器的训练或推理延迟和内存的公式或方程。与其在纸上计算或在Excel表中输入数据,不如让我们用llm-analysis自动化这些枯燥的事情
:gear:!
在指定的模型、GPU、数据类型和并行配置下,llm-analysis可以估算LLMs在训练或推理中的延迟和内存使用情况。通过llm-analysis,人们可以轻松理论上尝试不同的训练/推理设置,并更好地理解不同场景下的系统性能。
llm-analysis帮助回答以下问题:
- 使用什么批量大小、数据类型、并行方案才能得到一个
可行的
(不出现内存溢出)和最优的
(在延迟限制下最大化吞吐量)的训练或推理设置 - 给定设置下执行训练或推理所需的
时间
和成本
(GPU小时) - 如果使用不同的模型、GPU类型、GPU数量、权重和激活的数据类型、并行配置(例如
模型变化
、硬件改进
、量化
、并行化
等带来的性能提升),延迟/内存如何变化
示例
查看示例用例。使用llm-analysis,你可以在几分钟内完成这样的分析:rocket:。
快速开始
-
从pypi安装llm-analysis:
pip install llm-analysis
-
要安装最新的开发版本:
pip install --upgrade git+https://github.com/cli99/llm-analysis.git@main
-
从源码安装,克隆仓库并运行
pip install .
或poetry install
(通过pip install poetry
安装poetry)。
使用 LLMAnalysis
类
要在你的代码中集成llm-analysis,使用 LLMAnalysis
类。详见文档 LLMAnalysis。
LLMAnalysis
使用浮点运算和内存效率数值以及以下配置类构建:configuration classes:
ModelConfig
包含模型信息,即最大序列长度、变压器层数、注意力头数、隐藏层维度、词汇表大小GPUConfig
包括GPU计算和内存规格DtypeConfig
包括模型权重、激活和嵌入所用的位数ParallelismConfig
包括张量并行(tp
),流水线并行(pp
),序列并行(sp
),专家并行(ep
),和数据并行(dp
)。
然后 LLMAnalysis
可通过不同参数用 training 和 inference 方法进行查询。
命令行入口函数的使用
llm-analysis 提供了两个入口函数,train 和 infer,便于通过命令行界面使用。运行
python -m llm_analysis.analysis train --help
或
python -m llm_analysis.analysis infer --help
查看选项或阅读链接文档。参考示例了解它们的使用方法。
train
和 infer
使用预定义的名称到配置的映射(model_configs
, gpu_configs
, dtype_configs
)和其他用户输入的参数构建 LLMAnalysis
进行查询。
预定义的映射在运行时从 model_configs、gpu_configs 和 dtype_configs 文件夹下的模型、GPU 和数据类型配置 json
文件中填充。如需向映射中添加新的模型、GPU或数据类型进行查询,只需在相应的文件夹中添加一个 json
描述文件。
llm-analysis 还支持从模型配置 json
文件路径或 Hugging Face 中检索 ModelConfig
。
- 从本地模型配置
json
文件,例如python -m llm_analysis.analysis train --model_name=local_example_model.json
。检查model_configs文件夹下的模型配置。 - 从 Hugging Face,例如在调用
train
或infer
入口函数时使用EleutherAI/gpt-neox-20b
作为model_name
。python -m llm_analysis.analysis train --model_name=EleutherAI/gpt-neox-20b --total_num_gpus 32 --ds_zero 3
。使用此方法,llm-analysis 依赖transformers
来查找 huggingface.co/models 上对应的模型配置,这意味着新模型的信息仅在 transformers 库的某些版本后存在。要通过它们的名称访问最新模型,请更新已安装的transformers
包。
提供了一组便捷的命令来查询预定义映射以及 Hugging Face,或导出配置。运行 python -m llm_analysis.config --help
获取详细信息。
一些示例:
python -m llm_analysis.config get_model_config_by_name EleutherAI/gpt-neox-20b
从按名称填充的映射中获取 ModelConfig
,如果没有找到,llm-analysis 尝试从 Hugging Face 获取。
请注意,LLaMA 模型至少需要 transformers-4.28.1
版本才能检索,既可以更新到更高版本的 transformers
库,或者使用预定义的 LLaMA 模型 ModelConfig
(模型名称中的 /
替换为 _
)。
python -m llm_analysis.config list_gpu_configs
列出所有预定义GPU配置的名称,然后可以通过如下查询
python -m llm_analysis.config get_gpu_config_by_name a100-sxm-80gb
显示对应的 GPUConfig
。
如何设置FLOPS和内存效率
将flops和内存效率设置为1
(默认)给出了训练或推理延迟的下限,因为它假设了硬件的峰值性能(这在现实中是不会发生的)。
通过使用模型中的输入维度进行基准测试和分析可以找到更加接近实际的flops或内存效率。
如果必须做出假设,对于flops效率,文献报告大规模模型训练效率高达0.5
,推理效率最多可达到0.7
; 0.9
可以是内存效率的一个积极目标。
当前范围和局限
llm-analysis 旨在提供内存使用和延迟的下界
估计。
并行方案
llm-analysis 当前涵盖了张量并行(tp
),流水线并行(pp
),序列并行(sp
),专家并行(ep
)和数据并行(dp
)。
-
tp、pp 和 sp 采用
Megatron-LM
用于训练的并行化风格以及FasterTransformer
用于推理的并行化风格 -
在训练分析中,dp 分片假设使用
DeepSpeed ZeRO
或FSDP
。ds_zero
用于指定 dp 分片策略ds_zero DeepSpeed ZeRO FSDP 分片方式 0 禁用 NO_SHARD 无分片 1 Stage 1 N/A 分片优化器状态 2 Stage 2 SHARD_GRAD_OP 分片梯度和优化器状态 3 Stage 3 FULL_SHARD 分片梯度、优化器状态、模型参数 -
ep 将 MLP 专家的数量并行化到
ep_size
设备上,即每个 GPU 的专家数量为total number of experts / ep_size
。因此对于 MLP 模块,与模型的其他部分相比,其他并行化维度的设备数量被ep_size
除以。
通信
tp 通信计算使用 ring allreduce
。ep 通信计算使用 alltoall
。
当使用 FSDP 或 DeepSpeed ZeRO 时,dp 通信时间用于取消分片模型权重,估算并与计算延迟进行比较,两者中较大值用于总体延迟。
目前忽略其他 dp 和 pp 通信,即假设完全的计算和通信重叠,这在由于依赖关系通信不能与计算重叠,或由于互连速度慢或数据量大通信时间太长而无法隐藏时不成立。
激活重计算
llm-analysis 支持全激活和选择性激活重计算。
activation_recomputation | 记录和重计算内容 |
---|---|
0 | 无激活重计算;需要最多的内存 |
1 | 在 Transformer 层的注意力模块中检查点注意力计算(QK^T 矩阵乘法、softmax、softmax dropout 和 V 的注意力),如Reducing Activation Recomputation in Large Transformer Models中描述。 |
2 | 在 Transformer 层中检查点输入到注意力模块;需要对注意力进行额外的前向传递。 |
3 | 在 Transformer 层中检查点模块序列的输入(layernom-attention-layernom);需要对(layernom-attention-layernom)进行额外的前向传递。 |
4 | 全激活重计算存储 Transformer 层的输入;需要最少的内存;需要整个层的额外前向传递。 |
数据类型
数据类型按位数表达,目前只建模32
(FP32, TF32), 16
(FP16, BF16), 8
(INT8), 和 4
(INT4) 位数据类型。
微调
微调与预训练模型相同(由传递给 train
入口函数的 total_num_tokens
控制),因此假设完全微调(所有模型参数)。参数有效微调(PEFT)将在未来支持。
推理假设
推理假设在计算延迟时完美重叠计算和内存操作,在计算内存使用时最大化内存重用。
TODOs (敬请关注 :radio:)
查看下方的 TODO 了解接下来的内容,并敬请关注 :radio:! 欢迎任何贡献或反馈!
- 增加 dp(节点间和节点内)、ep(节点内)、pp(节点间)通信分析
- 支持高效微调方法,如LoRA 或 Adapters
- 增加 FP8 数据类型支持
- 支持训练和推理中的 CPU 卸载(权重、KV 缓存等)分析
- 支持其他硬件(例如 CPU)进行推理分析
引用
如果您在工作中使用了 llm-analysis,请引用:
Cheng Li. (2023). LLM-Analysis: Latency and Memory Analysis of Transformer Models for Training and Inference. GitHub repository, https://github.com/cli99/llm-analysis.
或者
@misc{llm-analysis-chengli,
author = {Cheng Li},
title = {LLM-Analysis: Latency and Memory Analysis of Transformer Models for Training and Inference},
year = {2023},
publisher = {GitHub},
journal = {GitHub repository},
howpublished = {\url{https://github.com/cli99/llm-analysis}},
}
贡献
欢迎提供贡献和建议。
llm-analysis 使用 pre-commit 确保代码格式一致。对于代码贡献的拉取请求,请安装 pre-commit(pip install pre-commit
)以及使用的钩子(在仓库中执行 pip install
),并在提交 PR 前格式化代码(在每次 git commit 前自动运行)。
有用链接
- Megatron-LM: Training Multi-Billion Parameter Language Models Using Model Parallelism
- ZeRO: Memory Optimizations Toward Training Trillion Parameter Models
- Efficient Large-Scale Language Model Training on GPU Clusters Using Megatron-LM
- Using DeepSpeed and Megatron to Train Megatron-Turing NLG 530B, A Large-Scale Generative Language Model
- Reducing Activation Recomputation in Large Transformer Models
- Training Compute-Optimal Large Language Models
- Efficiently Scaling Transformer Inference
- Training Compute-Optimal Large Language Models
- Understanding INT4 Quantization for Transformer Models: Latency Speedup, Composability, and Failure Cases
- A Comprehensive Study on Post-Training Quantization for Large Language Models