训练和推理的变压器模型的延迟和记忆分析
LLMAnalysis类关于如何计算大型语言模型(LLMS)或变形金刚的推理延迟以及记忆的论文,博客等,许多公式或方程式都在流动。 let's automate the boring stuff with llm-analysis ,而不是在论文上进行数学或打字!
鉴于指定的模型,GPU,数据类型和并行性配置,LLM分析估计了LLMS训练或推理的延迟和记忆使用情况。通过LLM分析,理论上可以轻松地尝试不同的培训/推理设置,并更好地了解不同情况的系统性能。
LLM分析有助于回答以下问题:
feasible (不获取OOM)和optimal (使用延迟约束最大化吞吐量)的批次大小,数据类型,并行性方案用于培训或推理cost (GPU小时)所花费的timemodeling change的性能, hardware improvement ,量化, quantization , parallelism等),则延迟/内存如何变化。检查示例用例。通过LLM分析,您可以在几分钟内进行此类分析!
安装PYPI的LLM分析:
pip install llm-analysis安装最新的开发构建:
pip install --upgrade git+https://github.com/cli99/llm-analysis.git@main要从源安装,请克隆回购并运行pip install .或poetry install ( pip install poetry )。
LLMAnalysis类要将LLM分析整合到您的代码中,请使用LLMAnalysis类。有关详细信息,请参阅Doc Llanalysis。
LLMAnalysis由拖船和内存效率数字以及以下配置类构建:
ModelConfig涵盖了模型信息,即最大序列长度,变压器层数,注意力头数,隐藏维度,词汇尺寸GPUConfig涵盖GPU计算和内存规格DtypeConfig涵盖用于模型重量,激活和嵌入的位数ParallelismConfig涵盖了张量并行性( tp ),管道并行性( pp ),序列并行性( sp ),专家并行性( ep )和数据并行性( dp )。然后LLMAnalysis可以通过训练和推理方法来查询不同的论点。
LLM分析提供了两个输入功能,即训练和推断,以易于通过命令行接口使用。跑步
python -m llm_analysis.analysis train --help或者
python -m llm_analysis.analysis infer --help检查选项或读取链接的文档。请参阅示例以查看如何使用它们。
train和infer使用预定义的名称对配置映射( model_configs , gpu_configs , dtype_configs )和其他用户输入参数来构建LLMAnalysis并进行查询。
预定义的映射在模型,GPU和数据类型配置的运行时填充了Model_Configs,gpu_configs和dtype_configs下的json文件。要将新模型,GPU或数据类型添加到查询的映射中,只需将json描述文件添加到相应的文件夹即可。
LLM-分析还支持从模型配置JSON文件路径或用模型名称拥抱面的ModelConfig 。
python -m llm_analysis.analysis train --model_name=local_example_model.json 。检查Model_Configs文件夹下的模型配置。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分析依靠transformers在huggingface.co/models上找到相应的模型配置,这意味着新模型的信息仅在Transformers库的某些版本之后才存在。要通过其名称访问最新型号,请更新已安装的transformers软件包。提供了方便命令的列表来查询预定义映射以及拥抱面或转储配置。运行python -m llm_analysis.config --help以获取详细信息。
一些例子:
python -m llm_analysis.config get_model_config_by_name EleutherAI/gpt-neox-20b从填充的名称映射(如果找不到的话)中获取ModelConfig ,LLM-分析试图从Huggingface获取它。
/注意,Llama模型至少需要transformers-4.28.1才能检索,要么更新到后来的transformers库,要么使用Llama Models的预定义的ModelConfig (在模型名称中替换为_ )。
python -m llm_analysis.config list_gpu_configs列出所有预定义GPU配置的名称,然后您可以查询
python -m llm_analysis.config get_gpu_config_by_name a100-sxm-80gb显示相应的GPUConfig 。
将拖放和内存效率设置为1 (默认)给出了训练或推理潜伏期的下限,因为它假定了峰值硬件性能(从来都不是这种情况)。通过使用模型中的输入尺寸进行基准测试和分析,可以找到接近现实的拖船或内存效率。
如果必须做出假设,为了效率,文献对大规模模型培训的报告最高为0.5 ,而推断高达0.7 ; 0.9可以是记忆效率的积极目标。
LLM分析旨在提供对记忆使用和延迟的lower-bound估计。
LLM分析目前涵盖张量并行性(TP),管道并行性(PP),序列并行性(SP),专家并行性(EP)和数据并行性(DP)。
TP,PP和SP采用Megatron-LM中使用的并行化风格,用于训练和推理的FasterTransformer
在训练分析中,DP碎片使用DeepSpeed ZeRO或FSDP假设。 ds_zero用于指定DP碎片策略
| DS_ZERO | 深速零 | FSDP | 碎片 |
|---|---|---|---|
| 0 | 禁用 | no_shard | 没有碎片 |
| 1 | 阶段1 | N/A。 | 碎片优化器状态 |
| 2 | 阶段2 | shard_grad_op | 碎片梯度和优化器状态 |
| 3 | 阶段3 | full_shard | 碎片梯度,优化状态,模型参数 |
EP平行于ep_size设备的MLP专家数量,即每GPU的专家数量是total number of experts / ep_size 。因此,对于MLP模块,与模型的其他部分相比,其他并行化尺寸的设备数被ep_size划分。
TP通信被计算为使用ring allreduce 。 EP通信被计算为使用alltoall 。估计使用FSDP或DeepSpeed Zero时,DP通信时间与计算延迟进行比较,并将两者的较大值用于整体延迟。目前忽略了其他DP和PP通信,即假定完美的计算和通信重叠,当通信不能因依赖性而无法与计算重叠时,或者由于速度缓慢或大量数据量而隐藏的通信时,这是不正确的。
LLM分析支持完整的和选择性激活的重新成像。
| Activation_recompunt | 什么是检查点和重新计算 |
|---|---|
| 0 | 没有激活重新成像;需要最多的内存 |
| 1 | 检查点在变压器层的注意模块中,将注意力计算(qk^t矩阵乘,softmax,softmax辍学和注意);如减少大型变压器模型中的激活重新计算所述。 |
| 2 | 检查点在变压器层中的注意模块的输入;需要额外的前进关注。 |
| 3 | 检查点在变压器层中的模块序列(分层 - 注意线)的输入;需要额外的向前传递(专注于分层的layernom)。 |
| 4 | 完整的激活重新计算将输入存储到变压器层;需要最少的内存;需要整个层的额外向前通过。 |
数据类型用位数表示,仅32 (FP32,TF32), 16 (FP16,BF16), 8 (INT8)和4 (INT4)位数据类型现已建模。
微调建模相同(由total_num_tokens控制到train进入功能)作为预训练,因此假设完整(所有模型参数)微调。参数有效的微调(PEFT)在未来的支持中。
推理在计算延迟时假定计算和内存操作的完美重叠,并在计算内存使用时最大的内存重复使用。
检查下面的戒酒中的下一步并保持关注吗?非常欢迎任何贡献或反馈!
如果您在工作中使用LLM分析,请引用:
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-分析使用预先承诺来确保代码格式一致。对于带有代码贡献的拉请求,请在提交PR之前安装预密码( pip install pre-commit )以及使用的挂钩(在存储库中的pip install ),然后格式化代码(在每个Git Commit之前自动运行)。