Latenz und Gedächtnisanalyse von Transformatormodellen für Training und Inferenz
LLMAnalysis -Klasse Viele Formeln oder Gleichungen schweben in Papieren, Blogs usw. herum, um das Training oder die Latenz und das Gedächtnis von Inferenz für große Sprachmodelle (LLMs) oder Transformatoren zu berechnen. Anstatt auf Papieren zu mathemen oder in Excel-Blättern zu tippen, let's automate the boring stuff with llm-analysis !
Angesichts des angegebenen Modells schätzt die GPU-, Datentyp- und Parallelitätskonfigurationen, LLM-Analyse die Latenz und Speicherverwendung von LLMs für das Training oder die Inferenz. Mit der LLM-Analyse kann man theoretisch leicht unterschiedliche Trainings-/Inferenz-Setups ausprobieren und die Systemleistung für verschiedene Szenarien besser verstehen.
Die LLM-Analyse beantwortet Fragen wie:
feasible (nicht erhaltener OOM) und optimal (maximaler Durchsatz mit einer Latenzbeschränkung) für das Training oder die Inferenz erhaltentime , die mit dem angegebenen Setup benötigt wird, um Schulungen oder Inferenz und cost durchzuführen (GPU-Stunden)modeling change , hardware improvement , quantization , parallelism usw. vorschlägt)Überprüfen Sie die Beispiel -Anwendungsfälle. Mit LLM-Analyse können Sie diese Analyse in Minuten durchführen!
So installieren Sie die LLM-Analyse von PYPI:
pip install llm-analysisSo installieren Sie den neuesten Entwicklungsbau:
pip install --upgrade git+https://github.com/cli99/llm-analysis.git@main Um aus der Quelle zu installieren, klonen Sie das Repo und führen Sie pip install . oder poetry install (Gedichte nach pip install poetry ).
LLMAnalysis -Klasse Verwenden Sie die LLMAnalysis -Klasse, um die LLM-Analyse in Ihren Code zu integrieren. Einzelheiten finden Sie in der Doc Llmanalysis.
LLMAnalysis ist mit Flops- und Speicher -Effizienz -Zahlen und den folgenden Konfigurationsklassen konstruiert:
ModelConfig umfasst Modellinformationen, dh Max -Sequenzlänge, Anzahl der Transformatorschichten, Anzahl der Aufmerksamkeitsköpfe, versteckte Dimension, WortschatzgrößeGPUConfig deckt GPU -Rechen- und Speicherspezifikationen abDtypeConfig deckt die Anzahl der für das Modellgewicht, Aktivierung und Einbettung verwendeten Bits abParallelismConfig deckt den Tensor -Parallelismus ( tp ), Pipeline -Parallelität ( pp ), Sequenzparallelität ( sp ), Expertenparallelität ( ep ) und Datenparallelität ( dp ) ab. Anschließend kann LLMAnalysis durch die Trainings- und Inferenzmethoden mit unterschiedlichen Argumenten abgefragt werden.
Die LLM-Analyse bietet zwei Einstiegsfunktionen, trainiert und schließt, um eine einfache Verwendung über die Befehlszeilenschnittstelle zu verwenden. Laufen
python -m llm_analysis.analysis train --helpoder
python -m llm_analysis.analysis infer --helpSo überprüfen Sie die Optionen oder lesen Sie den verknüpften Dokument. Siehe Beispiele, um zu sehen, wie sie verwendet werden.
train und infer verwenden Sie die vordefinierten Namen zu Konfigurationszuordnungen ( model_configs , gpu_configs , dtype_configs ) und andere Argumente für Benutzer-Input, um die LLMAnalysis zu konstruieren und die Abfrage durchzuführen.
Die vordefinierten Zuordnungen werden zur Laufzeit aus den json Dateien Modell, GPU und Datentyp unter model_configs, gpu_configs und dtype_configs besiedelt. Um ein neues Modell, eine GPU oder einen neuen Datentyp zur Abfrage für die Abfrage hinzuzufügen, fügen Sie dem entsprechenden Ordner einfach eine json -Beschreibungsdatei hinzu.
Die LLM-Analyse unterstützt auch das Abrufen von ModelConfig von einem Modellkonfigurations-JSON-Dateipfad oder dem Umarmungsgesicht mit dem Modellnamen.
python -m llm_analysis.analysis train --model_name=local_example_model.json Überprüfen Sie die Modellkonfigurationen im Ordner model_configs.EleutherAI/gpt-neox-20b als model_name , wenn Sie den train oder die infer aufrufen. python -m llm_analysis.analysis train --model_name=EleutherAI/gpt-neox-20b --total_num_gpus 32 --ds_zero 3 . Mit dieser Methode beruht die LLM-Analyse auf transformers , um die entsprechende Modellkonfiguration auf Huggingface.co/Models zu ermitteln, was bedeutet, dass Informationen von neueren Modellen erst nach einer bestimmten Version der Transformers-Bibliothek vorhanden sind. Um über ihre Namen über die neuesten Modelle zuzugreifen, aktualisieren Sie das installierte transformers -Paket. Die Abfrage an den vordefinierten Zuordnungen sowie um das Umarmungsgesicht oder zum Ableiten von Konfigurationen wird eine Liste praktischer Befehle zur Verfügung gestellt. Führen Sie python -m llm_analysis.config --help für Details aus.
Einige Beispiele:
python -m llm_analysis.config get_model_config_by_name EleutherAI/gpt-neox-20b Ruft das ModelConfig aus der besiedelten Zuordnung nach Namen, wenn nicht gefunden, von LLM-Analyse versucht, sie vom Umarmungsface zu erhalten.
Beachten Sie, dass Lama-Modelle mindestens transformers-4.28.1 , um entweder in einer späteren transformers zu aktualisieren oder die vordefinierte ModelConfig für Lama-Modelle zu verwenden ( / in Modellnamen werden durch _ ersetzt).
python -m llm_analysis.config list_gpu_configsListet die Namen aller vordefinierten GPU -Konfigurationen auf, dann können Sie mit Abfragen
python -m llm_analysis.config get_gpu_config_by_name a100-sxm-80gb um die entsprechende GPUConfig zu zeigen.
Das Einstellen von Flops und Speichereffizienz auf 1 (Standard) ergibt die Untergrenze des Trainings oder der Inferenzlatenz, da die Leistung der Spitzenhardware (die niemals der Fall ist). Eine nahezu unmittelbare Flops oder eine Speichereffizienz findet sich durch Benchmarking und Profiling unter Verwendung der Eingangsabmessungen im Modell.
Wenn man Annahmen, für die Flops -Effizienz treffen muss, berichtet Literatur bis zu 0.5 für das Modell des Modells in großem Maßstab und bis zu 0.7 für Inferenz; 0.9 kann ein aggressives Ziel für die Gedächtniseffizienz sein.
Die LLM-Analyse zielt darauf ab, eine lower-bound Schätzung der Speicherverwendung und -latenz zu schätzen.
Die LLM-Analyse deckt derzeit die Tensor-Parallelität (TP), Pipeline-Parallelität (PP), Sequenzparallelität (SP), Expertenparallelität (EP) und Datenparallelität (DP) ab.
TP, PP und SP nehmen den in Megatron-LM für Training und FasterTransformer für Inferenz verwendeten Parallelisierungsstil an
In der Trainingsanalyse geht DP Sharding unter Verwendung von DeepSpeed ZeRO oder FSDP an. ds_zero wird verwendet, um die DP Sharding -Strategie anzugeben
| ds_zero | Deepspeed Null | FSDP | Sharding |
|---|---|---|---|
| 0 | deaktiviert | No_shard | Kein Sharding |
| 1 | Stufe 1 | N / A | Shard -Optimiererzustände |
| 2 | Stufe 2 | Shard_grad_op | Shard -Gradienten und Optimiererzustände |
| 3 | Stufe 3 | Full_shard | Shard -Gradienten, Optimiererzustände, Modellparameter |
EP parallele die Anzahl der MLP -Experten über ep_size -Geräte hinweg, dh die Anzahl der Experten pro GPU ist total number of experts / ep_size . Somit ist für das MLP -Modul die Anzahl der Geräte für andere Parallelisierungsdimensionen durch ep_size im Vergleich zu anderen Teilen des Modells geteilt.
Die TP -Kommunikation wird als Verwendung von ring allreduce berechnet. Die EP -Kommunikation wird als Verwendung alltoall berechnet. Die DP -Kommunikationszeit zum Unscharfmodellgewicht Bei Verwendung von FSDP oder DeepSpeed Null wird geschätzt und mit der Berechnungslatenz verglichen. Der größere Wert der beiden wird für die Gesamtlatenz verwendet. Andere DP- und PP -Kommunikation werden vorerst ignoriert, dh unter der Annahme eines perfekten Rechen- und Kommunikationsüberlappens, was nicht zutrifft, wenn sich die Kommunikation aufgrund von Abhängigkeit nicht mit dem Rechen überlappen kann oder wenn die Kommunikation aufgrund der langsamen Verbindung oder des großen Datenvolumens zu lang ist, um sich zu verbergen.
Die LLM-Analyse unterstützt sowohl die vollständige als auch die selektive Aktivierung der Aktivierung.
| Activation_Recomputation | Was wird bewegt und neu berechnet |
|---|---|
| 0 | Keine Aktivierung neu komputiert; erfordert die meiste Menge an Speicher |
| 1 | Checkpoints Die Aufmerksamkeitsberechnung (qk^t Matrix multiplizieren, Softmax, Softmax -Tropfen und Aufmerksamkeit über V.) im Aufmerksamkeitsmodul einer Transformatorschicht; wie bei der Reduzierung der Aktivierung der Aktivierung in großen Transformatormodellen beschrieben. |
| 2 | Checkpoints den Eingang zum Aufmerksamkeitsmodul in einer Transformatorschicht; Benötigt einen zusätzlichen Vorwärtspass für die Aufmerksamkeit. |
| 3 | Checkpoints die Eingabe in die Sequenz von Modulen (Layernom-Attention-Layernom) in einer Transformatorschicht; erfordert einen zusätzlichen Vorwärtspass (Layernom-Attentention-Layernom). |
| 4 | Durch die vollständige Aktivierung des Rekomputation speichert die Eingabe in die Transformatorschicht. erfordert die geringste Menge an Speicher; Benötigt einen zusätzlichen Vorwärtspass der gesamten Schicht. |
Datentypen werden mit der Anzahl der Bits ausgedrückt, nur 32 (FP32, TF32), 16 (FP16, BF16), 8 (int8) und 4 (int4) Bit -Datentypen werden vorerst modelliert.
Die Feinabstimmung wird gleich modelliert (kontrolliert von total_num_tokens , die an die train übergeben werden) wie vor dem Training, wodurch die Feinabstimmung (alle Modellparameter) angenommen wird. Parameter-effizientes Feinabstimmung (PEFT) ist in zukünftiger Unterstützung.
Inferenz wird bei der Berechnung der Latenz und der maximalen Wiederverwendung von Speicher bei der Berechnung des Speicherverbrauchs eine perfekte Überlappung von Rechen- und Speichervorgängen vorausgesetzt.
Schauen Sie sich die folgenden Todos an, was als nächstes kommt, und bleiben Sie dran?! Alle Beiträge oder Feedback sind sehr willkommen!
Wenn Sie LLM-Analyse in Ihrer Arbeit verwenden, zitieren Sie bitte:
Cheng Li. (2023). LLM-Analysis: Latency and Memory Analysis of Transformer Models for Training and Inference. GitHub repository, https://github.com/cli99/llm-analysis.
oder
@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}},
}
Beiträge und Vorschläge sind willkommen.
Die LLM-Analyse verwendet Vorkommit, um sicherzustellen, dass die Codeformatierung konsistent ist. Für Pull-Anfragen mit Codebeitrag installieren Sie bitte das Pre-Commit ( pip install pre-commit ) sowie die gebrauchten Hooks ( pip install im Repo) und formatieren Sie den Code (wird automatisch vor jedem Git-Commit) vor dem Senden der PR eingerichtet.