Diese Codebasis ist die Implementierung von LayerSkip: Enabling Early Exit Inference and Self-Speculative Decoding.
$ 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
Zugriffsmodelle: Um eine Beschleunigung zu beobachten, müssen Sie auf LLMs zugreifen, die mit dem LayerSkip-Rezept trainiert wurden. Wir bieten 6 Kontrollpunkte für HuggingFace verschiedener Llama-Modelle, die kontinuierlich mit dem LayerSkip-Rezept vorab trainiert wurden:
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
Um auf jedes Modell zuzugreifen:
huggingface-cli login
aus und Sie werden aufgefordert, das Token anzugeben, das Sie in Schritt 3 erhalten haben.Sobald Sie diese Schritte ausgeführt haben, sollten die folgenden Befehle zum Ausführen der LayerSkip-Prüfpunkte funktionieren.
So führen Sie eines unserer Modelle im interaktiven Modus mit regulärer autoregressiver Dekodierung aus:
$ torchrun generate.py --model facebook/layerskip-llama2-7B
--sample True
--max_steps 512
Um die Beschleunigung zu beobachten, müssen Sie selbstspekulative Dekodierung verwenden, um Token zu generieren, und --exit_layer
, die Ebene, auf der die Entwurfsphase beendet werden soll, und --num_speculations
, die Anzahl der Entwurfs-Tokens angeben:
$ torchrun generate.py --model facebook/layerskip-llama2-7B
--sample True
--max_steps 512
--generation_strategy self_speculative
--exit_layer 8
--num_speculations 6
Tipps:
--model
in ein beliebiges HuggingFace-Modell ändern, aber um eine Beschleunigung bei der selbstspekulativen Dekodierung zu beobachten, verwenden Sie ein Modell, das mit dem LayerSkip-Rezept trainiert wurde, wie zum Beispiel diejenigen, die wir als Open Source auf HuggingFace bereitgestellt haben.--sample
, --temperature
, --top_p
und --top_k
ändern.python generate.py --help
ausführen, um Einzelheiten zu verschiedenen Befehlszeilenargumenten zu erhalten. So vergleichen Sie einen Datensatz:
$ 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
Tipps:
--dataset
ändern:cnn_dm_summarization
: CNN/DM-Zusammenfassungxsum_summarization
: XSUM-Zusammenfassungcnn_dm_lm
: CNN/DM-Sprachmodellierung (anhand der ersten paar Wörter eines Artikels den restlichen Artikel generieren)human_eval
: HumanEval-Codierungn
-shot wechseln, indem Sie das Argument --n_shot
angeben.--sample
, --temperature
, --top_p
und --top_k
ändern.python benchmark.py --help
ausführen, um Details zu verschiedenen Befehlszeilenargumenten zu erhalten. Wir haben unsere Generierungsskripte in Eleuther Language Model Evaluation Harness integriert, um eine große Anzahl von Aufgaben zu ermöglichen und generierten Text ordnungsgemäß nachzubearbeiten.
$ 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
Tipps:
gsm8k
oder cnn_dailymail
) erzielen können, während dies bei Klassifizierungsaufgaben, z. B. Multiple-Choice-Fragenaufgaben (z. B. piqa
, social_iqa
) oder Wahr/Falsch-Fragenaufgaben (z. B. boolq
) der Fall ist nicht zu einer Beschleunigung führen.--tasks
können Sie eine beliebige Anzahl von Aufgaben angeben, die von Eleuther Evaluation Harness unterstützt werden. Um eine Liste aller möglichen Aufgaben zu erhalten, klicken Sie auf diesen Link.generate.py
und benchmark.py
können Sie verschiedene Modelle, Datensätze und Stichprobenparameter angebenpython benchmark.py --help
ausführen, um Details zu verschiedenen Befehlszeilenargumenten zu erhalten. Unsere Inferenz-Hyperparameter exit_layer
und num_speculations
bestimmen die Beschleunigung während der Inferenz:
exit_layer
:num_speculations
: Die optimale Kombination von exit_layer
und num_speculations
kann sich je nach Modell, Datensatz und Stichprobenparametern ändern. Daher haben wir ein Skript bereitgestellt, um ein Raster aus verschiedenen exit_layer
und num_speculations
zu durchsuchen:
$ 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
Dadurch wird eine CSV-Datei in dem im Argument --outpu_dir
angegebenen Verzeichnis erstellt.
Tipps:
generate.py
und benchmark.py
können Sie verschiedene Modelle, Datensätze und Stichprobenparameter angebenpython sweep.py --help
ausführen, um Details zu verschiedenen Befehlszeilenargumenten zu erhalten. Um zu überprüfen, ob die generierten Token unseres selbstspekulativen Dekodierungsalgorithmus korrekt sind, haben wir ein Skript erstellt, um die Ergebnisse der autoregressiven Dekodierung mit denen der selbstspekulativen Dekodierung zu vergleichen. Beachten Sie, dass wir die Äquivalenz der Ausgaben nur garantieren können, wenn kein Sampling erfolgt (z. B. --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
Bitte überprüfen Sie DOCKER.md, um das Projekt mit Docker einzurichten
Wir haben auch andere Implementierungen der LayerSkip-Inferenz:
torch.compile()
, Quantisierung und Tensorparallelität zu ermöglichen.Die Implementierung unserer Schulung ist in Arbeit. Einzelheiten und Diskussionen finden Sie in dieser Pull-Anfrage.
LayerSkip ist unter der CC-by-NC-Lizenz lizenziert. Sehen Sie sich die Datei LICENSE im Verzeichnis der obersten Ebene an.
Wir freuen uns über Beiträge zu LayerSkip. Wenn Sie daran interessiert sind, einen Beitrag zu leisten, sehen Sie sich bitte dieses Dokument an.
Wenn Sie LayerSkip in Ihrer Recherche verwenden, verwenden Sie bitte den folgenden BibTex-Eintrag:
@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 " ,
}