訓練和推理的變壓器模型的延遲和記憶分析
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之前自動運行)。