トレーニングと推論のための変圧器モデルのレイテンシとメモリ分析
LLMAnalysisクラスを使用します大規模な言語モデル(LLM)またはトランスのトレーニングまたは推論の潜時とメモリを計算する方法について、多くの式または方程式が論文、ブログなどに浮かんでいます。論文で数学をしたり、Excelシートで入力したりするのではなく、 let's automate the boring stuff with llm-analysis !
指定されたモデル、GPU、データ型、および並列性の構成を考えると、LLM分析では、トレーニングまたは推論のためのLLMの潜時とメモリ使用量を推定します。 LLM分析により、理論的に異なるトレーニング/推論のセットアップを簡単に試して、さまざまなシナリオのシステムパフォーマンスをよりよく理解できます。
LLM分析は、次のような質問に答えるのに役立ちます。
feasible (OOMを取得しない)とoptimal (レイテンシの制約でスループットを最大化する)トレーニングまたは推論のセットアップを取得するために使用する並列系スキームcost (GPU時間)を行うために与えられたセットアップでtimeがかかりますquantizationタイプ、GPUの数、重みとアクティベーションのデータタイプ、並列処理構成を使用hardware improvementた場合modeling changeレイテンシ/メモリ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 llmanalysisを参照してください。
LLMAnalysis 、フロップとメモリ効率の数字と次の構成クラスで構築されています。
ModelConfig 、モデル情報、つまり最大シーケンスの長さ、変圧器層の数、注意ヘッド数、隠された寸法、語彙をカバーしていますGPUConfig 、GPUの計算とメモリの仕様をカバーしていますDtypeConfig 、モデルの重量、活性化、埋め込みに使用されるビットの数をカバーしていますParallelismConfig 、テンソル並列性( tp )、パイプライン並列性( pp )、シーケンス並列性( sp )、エキスパート並列性( ep )、およびデータ並列性( dp )をカバーしています。次に、トレーニング方法と推論方法を通じて、異なる引数でLLMAnalysis照会できます。
LLM-Analysisは、コマンドラインインターフェイスを介して使いやすいために、トレーニングと推測の2つのエントリ機能を提供します。走る
python -m llm_analysis.analysis train --helpまたは
python -m llm_analysis.analysis infer --helpオプションを確認するか、リンクされたドキュメントを読み取ります。例を参照して、それらがどのように使用されているかを確認してください。
事前に定義された名前から構成のマッピング( model_configs 、 gpu_configs 、 dtype_configs )およびその他のユーザー入力引数を使用してtrain infer LLMAnalysisを構築してクエリを実行します。
事前に定義されたマッピングは、モデル、GPU、およびデータ型構成jsonファイル、Model_Configs、gpu_configs、およびdtype_configsの実行時に入力されます。新しいモデル、GPUまたはデータ型をクエリのマッピングに追加するには、 json説明ファイルを対応するフォルダーに追加するだけです。
LLM-Analysisは、Model Config 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パッケージを更新します。便利なコマンドのリストは、事前に定義されたマッピング、および顔を抱き締めるマッピング、または構成をダンプするために提供されます。詳細については、 python -m llm_analysis.config --help実行します。
いくつかの例:
python -m llm_analysis.config get_model_config_by_name EleutherAI/gpt-neox-20b LLM-Analysis ModelConfig 、huggingfaceからそれを取得しようとします。
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を表示します。
フロップとメモリ効率を1 (デフォルト)に設定すると、ピークハードウェアのパフォーマンスを想定しているため、トレーニングまたは推論のレイテンシの下限が得られます(決して当てはまりません)。モデルの入力寸法を使用してベンチマークとプロファイリングによって、現実性の近くのフロップまたはメモリ効率が見つかります。
フロップ効率のために仮定を立てなければならない場合、文献は大規模なモデルトレーニングで最大0.5 、推論では最大0.7を報告しています。 0.9 、メモリ効率の積極的なターゲットになる可能性があります。
LLM分析は、メモリの使用量と遅延のlower-bound推定を提供することを目指しています。
LLM分析は現在、テンソル並列症(TP)、パイプライン並列性(PP)、シーケンス並列性(SP)、エキスパート並列性(EP)、およびデータ並列性(DP)をカバーしています。
TP、PP、およびSPは、トレーニングのためにMegatron-LMで使用される並列化のスタイルを採用し、推論のためのよりFasterTransformer
トレーニング分析では、DP Shardingは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ゼロを使用する場合のDP通信モデルの重量までのshardへの時間が推定され、計算レイテンシと比較されると、2つのより大きな値が全体的なレイテンシに使用されます。他のDPおよびPP通信は今のところ無視されています。つまり、完全な計算と通信の重複を想定しています。これは、依存関係のために通信がコンピューティングと重複できない場合、または相互接続が遅いまたは大規模なデータボリュームのために非表示になるには通信が長すぎる場合は真実ではありません。
LLM分析は、完全および選択的活性化の両方の再構成をサポートしています。
| Activation_Recomputation | チェックポイントと再計算されたもの |
|---|---|
| 0 | 活性化の再計算はありません。最も多くのメモリが必要です |
| 1 | チェックポイントトランス層の注意モジュールの注意計算(qk^tマトリックスの乗算、ソフトマックス、ソフトマックスドロップアウト、および注意)を確認します。大規模な変圧器モデルの活性化再構成を減らすことで説明されているように。 |
| 2 | 変圧器層の注意モジュールへの入力をチェックポイントします。注意を向けるための追加の前方パスが必要です。 |
| 3 | 変圧器層のモジュール(Layernom-Attention-Layernom)のシーケンスへの入力をチェックポイントします。余分な前方パス(Layernom-Attention-Layernom)が必要です。 |
| 4 | 完全な活性化再構成は、トランス層への入力を保存します。メモリの最小量が必要です。レイヤー全体の追加の前方パスが必要です。 |
データ型は、ビット数で表され、 32 (FP32、TF32)、 16 (FP16、BF16)、 8 (INT8)、および4 (INT4)ビットデータ型のみがモデル化されています。
微調整は、トレーニング前と同じようにモデル化されます( total_num_tokensがtrain入力機能に渡された)。パラメーター効率の高い微調整(PEFT)は、将来のサポートにあります。
推論は、レイテンシを計算するときに計算とメモリ操作の完全な重複を想定し、メモリ使用量を計算するときに最大メモリの再利用を想定します。
次のことについては、以下のTodosをチェックしてください。貢献やフィードバックは大歓迎です!
仕事で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-Analysisは、事前コミットを使用して、コードのフォーマットが一貫していることを確認します。コードの貢献を備えたプル要求については、PRを提出する前に、コードコミット( pip install pre-commit )と使用済みフック(リポジトリにpip install )をインストールし、コード(各gitコミットの前に自動的に実行)をフォーマットしてください。