このコード ベースは、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 チェックポイントを実行するための以下のコマンドが機能するはずです。
通常の自己回帰デコードを使用してモデルの 1 つを対話モードで実行するには、次のようにします。
$ 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 モデルに変更できますが、自己投機的デコードによる高速化を確認するには、HuggingFace でオープンソース化されているような、LayerSkip レシピを使用してトレーニングされたモデルを使用してください。--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
ショットに変更できます。--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 評価ハーネスでサポートされる任意の数のタスクを指定できます。考えられるすべてのタスクのリストを取得するには、このリンクを確認してください。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
Docker を使用してプロジェクトをセットアップするには、DOCKER.md を確認してください。
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 " ,
}