Analyse de latence et de la mémoire des modèles de transformateurs pour la formation et l'inférence
LLMAnalysis De nombreuses formules ou équations flottent dans des articles, des blogs, etc., sur la façon de calculer la formation ou la latence et la mémoire d'inférence pour les modèles de grande langue (LLM) ou les transformateurs. Plutôt que de faire des mathématiques sur des papiers ou de taper des draps Excel, let's automate the boring stuff with llm-analysis !
Compte tenu du modèle, du GPU, du type de données et des configurations de parallélisme spécifiés, LLM-Analysis estime la latence et l'utilisation de la mémoire des LLM pour la formation ou l'inférence. Avec l'analyse LLM, on peut facilement essayer différentes configurations de formation / d'inférence théoriquement, et mieux comprendre les performances du système pour différents scénarios.
LLM-Analysis aide à répondre à des questions telles que:
feasible (ne pas obtenir OOM) et optimal (maximisation avec une contrainte de latence) pour la formation ou l'inférencetime qu'il faut avec la configuration donnée pour faire une formation ou une inférence et le cost (heures GPU)modeling change , hardware improvement , quantization , parallelism , etc.)Vérifiez l'exemple d'utilisation des cas. Avec une analyse LLM, vous pouvez faire une telle analyse en quelques minutes!
Pour installer une analyse LLM de PYPI:
pip install llm-analysisPour installer la dernière construction de développement:
pip install --upgrade git+https://github.com/cli99/llm-analysis.git@main Pour installer à partir de Source, clonez le repo et exécutez pip install . ou poetry install (installer la poésie par pip install poetry ).
LLMAnalysis Pour intégrer une analyse LLM dans votre code, utilisez la classe LLMAnalysis . Reportez-vous à Doc Llmanalysis pour plus de détails.
LLMAnalysis est construit avec des nombres d'efficacité des flops et de la mémoire et les classes de configuration suivantes:
ModelConfig couvre les informations du modèle, c'est-à-dire la longueur de séquence maximale, le nombre de couches de transformateur, le nombre de têtes d'attention, la dimension cachée, la taille du vocabulaireGPUConfig couvre les spécifications de calcul GPU et de mémoireDtypeConfig couvre le nombre de bits utilisés pour le poids du modèle, l'activation et l'intégrationParallelismConfig couvre le parallélisme du tenseur ( tp ), le parallélisme du pipeline ( pp ), le parallélisme de séquence ( sp ), le parallélisme expert ( ep ) et le parallélisme des données ( dp ). Ensuite, LLMAnalysis peut être interrogée avec différents arguments à travers les méthodes de formation et d'inférence.
LLM-Analysis fournit deux fonctions d'entrée, Train and inférer, pour une facilité d'utilisation via l'interface de ligne de commande. Courir
python -m llm_analysis.analysis train --helpou
python -m llm_analysis.analysis infer --helpPour vérifier les options ou lire le doc lié. Reportez-vous aux exemples pour voir comment ils sont utilisés.
train et infer Utilisez les mappages prédéfinis de nom à configuration ( model_configs , gpu_configs , dtype_configs ) et d'autres arguments d'entrée pour l'utilisateur pour construire la LLMAnalysis et faire la requête.
Les mappages prédéfinis sont remplis à l'exécution à partir des fichiers json du modèle, du GPU et du type de données sous Model_Configs, GPU_Configs et DTYPE_CONFIGS. Pour ajouter un nouveau modèle, GPU ou type de données au mappage pour la requête, ajoutez simplement un fichier de description json au dossier correspondant.
LLM-Analysis prend également en charge la récupération ModelConfig à partir d'un chemin de fichier JSON de configuration de modèle ou d'une face étreinte avec le nom du modèle.
python -m llm_analysis.analysis train --model_name=local_example_model.json . Vérifiez les configurations du modèle dans le dossier Model_Configs.EleutherAI/gpt-neox-20b comme model_name lorsque vous appelez le train ou infer les fonctions d'entrée. python -m llm_analysis.analysis train --model_name=EleutherAI/gpt-neox-20b --total_num_gpus 32 --ds_zero 3 . Avec cette méthode, LLM-Analysis s'appuie sur transformers pour trouver la configuration du modèle correspondant sur HuggingFace.co/Models, ce qui signifie que les informations des modèles plus récentes n'existent qu'après une certaine version de la bibliothèque Transformers. Pour accéder aux derniers modèles via leurs noms, mettez à jour le package transformers installé. Une liste de commandes pratiques est fournie pour interroger contre les mappages prédéfinis ainsi que la face étreinte ou pour vider les configurations. Exécutez python -m llm_analysis.config --help pour plus de détails.
Quelques exemples:
python -m llm_analysis.config get_model_config_by_name EleutherAI/gpt-neox-20b Obtient le ModelConfig de la cartographie peuplée par son nom, si elle n'est pas trouvée, LLM-Analysis essaie de l'obtenir de Huggingface.
Notez que les modèles LLAMA ont besoin au moins transformers-4.28.1 pour récupérer, soit mettre à jour vers une bibliothèque transformers ultérieure, soit utiliser le ModelConfig prédéfini pour les modèles LLAMA ( / dans les noms de modèles sont remplacés par _ ).
python -m llm_analysis.config list_gpu_configsÉnumére les noms de toutes les configurations de GPU prédéfinies, alors vous pouvez interroger avec
python -m llm_analysis.config get_gpu_config_by_name a100-sxm-80gb Pour montrer le GPUConfig correspondant.
La définition des flops et de l'efficacité de la mémoire à 1 (par défaut) donne la limite inférieure de la formation ou de la latence d'inférence, car il suppose les performances du matériel maximal (ce qui n'est jamais le cas). Un flops ou une efficacité de mémoire de près de la réalité peut être trouvé en comparaison et en profilage à l'aide des dimensions d'entrée dans le modèle.
Si l'on doit faire des hypothèses, pour l'efficacité des flops, la littérature rapporte jusqu'à 0.5 pour une formation de modèle à grande échelle et jusqu'à 0.7 pour l'inférence; 0.9 peut être une cible agressive pour l'efficacité de la mémoire.
L'analyse LLM vise à fournir une estimation de la mémoire et à la latence de la mémoire lower-bound .
L'analyse LLM couvre actuellement le parallélisme du tenseur (TP), le parallélisme du pipeline (PP), le parallélisme de séquence (SP), le parallélisme expert (EP) et le parallélisme des données (DP).
TP, PP et SP adoptent le style de parallélisation utilisé dans Megatron-LM pour la formation et FasterTransformer pour l'inférence
Dans l'analyse de la formation, DP Sharding suppose en utilisant DeepSpeed ZeRO ou FSDP . ds_zero est utilisé pour spécifier la stratégie de rupture DP
| ds_zero | Deeppeed zéro | FSDP | Fragment |
|---|---|---|---|
| 0 | désactivé | No_shard | Pas de rupture |
| 1 | Étape 1 | N / A | États d'optimiseur de fragment |
| 2 | Étape 2 | Shard_grad_op | Gradients de fragment et états d'optimiseur |
| 3 | Étape 3 | Full_shard | Gradients de fragment, états d'optimiseur, paramètres du modèle |
EP parallélise le nombre d'experts MLP sur les appareils ep_size , c'est-à-dire que le nombre d'experts par GPU est total number of experts / ep_size . Ainsi, pour le module MLP, le nombre de dispositifs pour d'autres dimensions de parallélisation est divisé par ep_size par rapport à d'autres parties du modèle.
La communication TP est calculée comme utilisant ring allreduce . La communication EP est calculée comme utilisant alltoall . Le temps de communication DP au poids du modèle non déchaîné lors de l'utilisation du FSDP ou du zéro de profondeur est estimé et comparé à la latence de calcul, la plus grande valeur des deux est utilisée pour la latence globale. D'autres communications DP et PP sont ignorées pour l'instant, c'est-à-dire en supposant un calcul parfait et un chevauchement de communication, ce qui n'est pas vrai lorsque la communication ne peut pas se chevaucher avec le calcul en raison de la dépendance, ou lorsque la communication est trop longue pour se cacher en raison d'une interconnexion lente ou d'un grand volume de données.
L'analyse LLM soutient la recomputation d'activation à la fois complète et sélective.
| activation_recomputation | ce qui est vérifié et recomputé |
|---|---|
| 0 | Aucune recomputation d'activation; nécessite le plus de mémoire |
| 1 | Points de contrôle Le calcul de l'attention (Matrice QK ^ T Multiply, Softmax, Softmax Dropout et l'attention sur V.) dans le module d'attention d'une couche de transformateur; comme décrit dans la réduction de la recommandation d'activation dans les grands modèles de transformateurs. |
| 2 | Check point l'entrée dans le module d'attention dans une couche de transformateur; nécessite une passe-temps supplémentaire. |
| 3 | Check Point l'entrée dans la séquence de modules (Layernom-Attention-Layernom) dans une couche de transformateur; Nécessite une passe avant supplémentaire (Layerom-Attention-Layernom). |
| 4 | Recomputation d'activation complète stocke l'entrée de la couche de transformateur; nécessite le moins de mémoire; nécessite une passe avant supplémentaire de toute la couche. |
Les types de données sont exprimés avec le nombre de bits, seulement 32 (FP32, TF32), 16 (FP16, BF16), 8 (INT8) et 4 (INT4) Les types de données sont modélisés pour le moment.
Le réglage fin est modélisé de la même manière (contrôlé par total_num_tokens transmis à la fonction de saisie train ) comme pré-formation, en supposant ainsi le réglage des paramètres complets (tous les paramètres du modèle). Le réglage fin et efficace par les paramètres (PEFT) est dans le support futur.
L'inférence suppose un chevauchement parfait des opérations de calcul et de mémoire lors du calcul de la latence et de la réutilisation maximale de la mémoire lors du calcul de l'utilisation de la mémoire.
Vérifiez les Todos ci-dessous pour la prochaine étape et restez à l'écoute ?! Toutes les contributions ou commentaires sont les bienvenus!
Si vous utilisez une analyse LLM dans votre travail, veuillez citer:
Cheng Li. (2023). LLM-Analysis: Latency and Memory Analysis of Transformer Models for Training and Inference. GitHub repository, https://github.com/cli99/llm-analysis.
ou
@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}},
}
Les contributions et les suggestions sont les bienvenues.
LLM-Analysis utilise le pré-engagement pour garantir que le formatage du code est cohérent. Pour les demandes de traction avec la contribution du code, veuillez installer le pré-engagement ( pip install pre-commit ) ainsi que les crochets utilisés ( pip install dans le repo), et formatez le code (s'exécute automatiquement avant chaque engagement GIT) avant de soumettre le PR.