此程式碼庫是 LayerSkip 的實作:啟用提前退出推理和自推測解碼。
$ 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
存取模型:為了觀察加速情況,您需要存取使用 LayerSkip 配方訓練的 LLM。我們在使用 LayerSkip 配方持續預訓練的不同 Llama 型號的 HuggingFace 上提供了 6 個檢查點:
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
為了訪問每個模型:
huggingface-cli login
,系統將提示您提供在步驟 3 中取得的令牌。運行這些步驟後,下面運行 LayerSkip 檢查點的命令應該可以工作。
要使用常規自回歸解碼在互動模式下運行我們的模型之一:
$ torchrun generate.py --model facebook/layerskip-llama2-7B
--sample True
--max_steps 512
為了觀察加速,您需要使用自推測解碼來產生令牌,並指定--exit_layer
,草稿階段退出的層,以及--num_speculations
,草稿令牌的數量:
$ torchrun generate.py --model facebook/layerskip-llama2-7B
--sample True
--max_steps 512
--generation_strategy self_speculative
--exit_layer 8
--num_speculations 6
尖端:
--model
更改為任何 HuggingFace 模型,但為了觀察自我推測解碼的加速情況,請使用使用 LayerSkip 配方訓練的模型,例如我們在 HuggingFace 上開源的模型。--sample
、 --temperature
、 --top_p
和--top_k
參數來變更採樣行為。python generate.py --help
以取得不同命令列參數的詳細資訊。 對資料集進行基準測試:
$ 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
尖端:
--dataset
參數來指定不同的任務:cnn_dm_summarization
:CNN/DM 總結xsum_summarization
: XSUM 總結cnn_dm_lm
:CNN/DM 語言建模(給定文章的前幾個單詞,產生剩餘的文章)human_eval
: HumanEval 編碼--n_shot
參數來變更為任何指定的n
-shot。--sample
、 --temperature
、 --top_p
和--top_k
參數來變更採樣行為。python benchmark.py --help
以取得有關不同命令列參數的詳細資訊。 我們已將生成腳本與 Eleuther 語言模型評估工具集成,以支援大量任務並正確後處理生成的文字。
$ 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
尖端:
gsm8k
或cnn_dailymail
)中獲得加速,而分類任務,即多項選擇題任務(例如piqa
、 social_iqa
)或真/假問題任務(例如boolq
)將獲得加速。--tasks
參數指定 Eleuther Evaluation Harness 支援的任意數量的任務。要獲取所有可能任務的列表,請檢查此連結。generate.py
和benchmark.py
腳本類似,您可以指定不同的模型、資料集和取樣參數python benchmark.py --help
以取得有關不同命令列參數的詳細資訊。 我們的推理超參數exit_layer
和num_speculations
決定推理過程中的加速:
exit_layer
:num_speculations
:exit_layer
和num_speculations
的最佳組合可能會隨著模型、資料集和取樣參數的變化而變化。因此,我們提供了一個腳本來掃描不同exit_layer
和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
這將在--outpu_dir
參數指定的目錄中建立一個 CSV 檔案。
尖端:
generate.py
和benchmark.py
腳本類似,您可以指定不同的模型、資料集和取樣參數python sweep.py --help
以取得不同命令列參數的詳細資訊。 為了驗證自推測解碼演算法產生的標記是否正確,我們建立了一個腳本來比較自迴歸解碼與自推測解碼的輸出。請注意,我們只能在沒有採樣時保證輸出的等效性(即--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
Kindy 檢查 DOCKER.md 以使用 docker 設定項目
我們還有 LayerSkip 推理的其他實作:
torch.compile()
、量化和張量並行性)進行組合。我們的培訓實施正在進行中。您可以查看此拉取請求以獲取詳細資訊和討論。
LayerSkip 根據 CC-by-NC 授權。請參閱頂級目錄中的 LICENSE 檔案。
我們歡迎對 LayerSkip 做出貢獻。如果您有興趣做出貢獻,請參閱此文件。
如果您在研究中使用 LayerSkip,請使用以下 BibTex 條目:
@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 " ,
}