Cette base de code est l'implémentation de LayerSkip : Activation de l'inférence de sortie anticipée et du décodage auto-spéculatif.
$ git clone [email protected]:facebookresearch/LayerSkip.git
$ cd LayerSkip
$ conda create --name layer_skip python=3.10
$ conda activate layer_skip
$ pip install -r requirements.txt
Modèles d'accès : afin d'observer l'accélération, vous devez accéder aux LLM qui ont été formés à l'aide de la recette LayerSkip. Nous fournissons 6 points de contrôle sur HuggingFace de différents modèles de Lama continuellement pré-entraînés à l'aide de la recette LayerSkip :
facebook/layerskip-llama2-7B
facebook/layerskip-llama2-13B
facebook/layerskip-codellama-7B
facebook/layerskip-codellama-34B
facebook/layerskip-llama3-8B
facebook/layerskip-llama3.2-1B
Pour accéder à chaque modèle :
huggingface-cli login
et vous serez invité à fournir le jeton que vous avez obtenu à l'étape 3.Une fois que vous avez exécuté ces étapes, les commandes ci-dessous pour exécuter les points de contrôle LayerSkip devraient fonctionner.
Pour exécuter un de nos modèles en mode interactif en utilisant le décodage autorégressif régulier :
$ torchrun generate.py --model facebook/layerskip-llama2-7B
--sample True
--max_steps 512
Afin d'observer l'accélération, vous devez utiliser le décodage auto-spéculatif pour générer des jetons et spécifier --exit_layer
, la couche à laquelle l'étape de brouillon doit quitter, et --num_speculations
, le nombre de brouillons de jetons :
$ torchrun generate.py --model facebook/layerskip-llama2-7B
--sample True
--max_steps 512
--generation_strategy self_speculative
--exit_layer 8
--num_speculations 6
Conseils:
--model
par n'importe quel modèle HuggingFace, mais afin d'observer l'accélération avec le décodage auto-spéculatif, utilisez un modèle formé à l'aide de la recette LayerSkip, comme ceux que nous avons en open source sur HuggingFace.--sample
, --temperature
, --top_p
et --top_k
.python generate.py --help
pour plus de détails sur les différents arguments de ligne de commande. Pour comparer sur un ensemble de données :
$ torchrun benchmark.py --model facebook/layerskip-llama2-7B
--dataset cnn_dm_summarization
--num_samples 100
--generation_strategy self_speculative
--exit_layer 8
--num_speculations 6
--output_dir ./logs
Conseils:
--dataset
:cnn_dm_summarization
: Résumé CNN/DMxsum_summarization
: Résumé XSUMcnn_dm_lm
: Modélisation du langage CNN/DM (à partir des premiers mots d'un article, générer l'article restant)human_eval
: Codage HumanEvaln
-shot spécifié en spécifiant l'argument --n_shot
.--sample
, --temperature
, --top_p
et --top_k
.python benchmark.py --help
pour plus de détails sur les différents arguments de ligne de commande. Nous avons intégré nos scripts de génération avec Eleuther Language Model Evaluation Harness pour permettre un grand nombre de tâches et post-traiter correctement le texte généré.
$ torchrun eval.py --model facebook/layerskip-llama2-7B
--tasks gsm8k
--limit 10
--generation_strategy self_speculative
--exit_layer 8
--num_speculations 6
--output_dir ./logs
Conseils:
gsm8k
ou cnn_dailymail
), tandis que les tâches de classification, c'est-à-dire les tâches de questions à choix multiples (par exemple, piqa
, social_iqa
) ou les tâches de questions Vrai/Faux (par exemple, boolq
) ne conduit pas à une accélération.--tasks
. Pour obtenir une liste de toutes les tâches possibles, consultez ce lien.generate.py
et benchmark.py
, vous pouvez spécifier différents modèles, ensembles de données et paramètres d'échantillonnagepython benchmark.py --help
pour plus de détails sur les différents arguments de ligne de commande. Nos hyperparamètres d'inférence, exit_layer
et num_speculations
déterminent l'accélération lors de l'inférence :
exit_layer
:num_speculations
: La combinaison optimale de exit_layer
et num_speculations
peut changer en fonction des paramètres du modèle, de l'ensemble de données et de l'échantillonnage. Par conséquent, nous avons fourni un script pour parcourir une grille de différents exit_layer
et num_speculations
:
$ torchrun sweep.py --model facebook/layerskip-llama2-7B
--dataset human_eval
--generation_strategy self_speculative
--num_samples 150
--max_steps 256
--output_dir ./logs/
--sample False
Cela créera un fichier CSV dans le répertoire spécifié dans l'argument --outpu_dir
.
Conseils:
generate.py
et benchmark.py
, vous pouvez spécifier différents modèles, ensembles de données et paramètres d'échantillonnagepython sweep.py --help
pour plus de détails sur les différents arguments de ligne de commande. Afin de vérifier que les jetons générés par notre algorithme de décodage auto-spéculatif sont corrects, nous avons créé un script pour comparer les sorties du décodage autorégressif avec le décodage auto-spéculatif. Notez que les sorties dont nous pouvons garantir l'équivalence ne peuvent être garanties que lorsqu'il n'y a pas d'échantillonnage (c'est-à-dire --sample False
) :
$ torchrun correctness.py --model facebook/layerskip-llama2-7B
--dataset human_eval
--generation_strategy self_speculative
--num_speculations 6
--exit_layer 4
--num_samples 10
--sample False
--output_dir ./logs
Veuillez vérifier DOCKER.md pour configurer le projet à l'aide de Docker
Nous avons également d'autres implémentations de l'inférence LayerSkip :
torch.compile()
, la quantification et le parallélisme tensoriel.La mise en œuvre de notre formation est en cours. Vous pouvez consulter cette pull request pour plus de détails et de discussions.
LayerSkip est sous licence CC-by-NC. Reportez-vous au fichier LICENSE dans le répertoire de niveau supérieur.
Nous apprécions les contributions à LayerSkip. Si vous souhaitez contribuer, veuillez consulter ce document.
Si vous utilisez LayerSkip dans votre recherche, veuillez utiliser l'entrée BibTex suivante :
@misc { layerskip ,
title = { LayerSkip: Enabling Early Exit Inference and Self-Speculative Decoding } ,
author = { Mostafa Elhoushi and Akshat Shrivastava and Diana Liskovich and Basil Hosmer and Bram Wasti and Liangzhen Lai and Anas Mahmoud and Bilge Acun and Saurabh Agarwal and Ahmed Roman and Ahmed A Aly and Beidi Chen and Carole-Jean Wu } ,
booktitle = " Proceedings of the 62nd Annual Meeting of the Association for Computational Linguistics (Volume 1: Long Papers) " ,
month = aug,
year = " 2024 " ,
address = " Bangkok, Thailand " ,
publisher = " Association for Computational Linguistics " ,
url = " https://aclanthology.org/2024.acl-long.681 " ,
doi = " 10.18653/v1/2024.acl-long.681 " ,
pages = " 12622--12642 " ,
}