deepbbt.pyで試してみませんか?ブラックボックスチューニング(BBT)は、少数のショット学習のために大規模な言語モデル(LLMS)を駆動するグラデーションフリーの方法です。 LLMSの勾配/バックプロパゲーションを必要とせずに、LLMSの入力に加えられたソフトプロンプトトークンのシーケンスを最適化します。したがって、事前に訓練された汎用LLMは、ブラックボックスモデルと見なされ、一部の推論サーバーに効率的に展開できます。このようなシナリオでは、言語モデルAs-a-Service(LMAA)と呼ばれ、BBTはモデル推論APIにのみアクセスすることで、完全なモデルチューニングに匹敵するパフォーマンスを達成できます。一般に、BBTは、8Kモデルのフォワードパス内のほとんどの言語理解データセットでかなりの結果を達成できます。
詳細については、Language-Model-As-As-ServiceのICMLペーパーブラックボックスチューニングと、大規模な言語モデルを備えたグラデーションフリーの未来に向けて、EMNLPペーパーBBTV2に記載されています。
論文で報告された結果を再現するために、各ランダムシードを使用して各データセットにBBTV2パフォーマンスを記録するGoogleシートもリリースします。同様の結果を得られない場合は、お気軽にご連絡ください。
ブラックボックスチューニングの実装は非常に簡単です。コードを確認して、独自の環境に簡単に実装できます。または、 pycma 、 Transformers 、 FastNLPに基づいて実装を実行する新しい環境を作成することができます。オプションで、 fitlog使用して実験結果を監視できます。コードのFitLog関連の行を使用して使用することができます。
conda create --name bbt python=3.8
conda activate bbt
pip install transformers==4.1.1
pip install fastNLP==0.6.0
pip install datasets
pip install cma
pip install sklearn
git clone https://github.com/txsun1997/Black-Box-Tuning
cd Black-Box-Tuningこれで、 run.shでブラックボックスチューニングを実行できます:
bash run.sh一般に、13分で次の結果が得られます(Nvidia 3090 GPUでテスト):
| SST-2分割 | 最高の精度 |
|---|---|
| 電車 | 100% |
| 開発者 | 96.88% |
| テスト | 90.48% |
私たちの論文で他の実験を再現するには、たとえば、 bbt.pyの議論を変更します。
python bbt.py
--task_name " sst2 "
--n_prompt_tokens 50
--intrinsic_dim 500
--k_shot 16
--device " cuda:0 "
--seed 42
--loss_type " ce "
--cat_or_add " add "
--budget 8000
--print_every 50
--eval_every 100元の論文で報告されているように同様の結果を得るには、文ペアタスクに--loss_type "hinge"を使用して(すなわち、MRPC、SNLI、およびRTE)、DBPediaに--budget 20000使用することをお勧めします。
さらに、ブラックボックスチューニングは並列評価もサポートしています。つまり、単一の大きなバッチにそれらを配置することにより、ソリューションの集団を並行して評価できます。例えば、
python bbt.py
--task_name " sst2 "
--n_prompt_tokens 50
--intrinsic_dim 500
--k_shot 16
--device " cuda:0 "
--seed 42
--loss_type " ce "
--cat_or_add " add "
--budget 300
--print_every 10
--eval_every 20
--parallelBBTV2は、BBTの改良バージョンです。 BBTV2は、単に入力層でプロンプトを最適化する代わりに、分割整理アルゴリズムを採用して、すべてのレイヤーのプロンプトを交互に最適化します(つまり、ディーププロンプト)。次のコマンドを使用してBBTV2を試すだけで、
python deepbbt.py
--model_name " roberta-large "
--task_name " agnews "
--n_prompt_tokens 50
--intrinsic_dim 500
--k_shot 16
--device " cuda:0 "
--seed 42
--loss_type " ce "
--cat_or_add " add "
--random_proj " normal "
--sigma 0.2
--alpha 0.2
--popsize 20
--bound 0
--budget 8000
--print_every 50
--eval_every 100BBTV2は通常、多くのラベル分類タスク(例、DBPEDIA)および関与タスク(MRPC、SNLI、RTEなど)でより良い結果を付与します。 BBTV2の結果を再現する問題がある場合は、Googleシートを確認してください。
勾配降下によるトレーニングとは対照的に、BBT(およびBBTV2)はモデルの前方計算のみを必要とするため、ONNXランタイムまたはNvidia Tensortを使用して大幅に加速できます。
ここでは、ONNXランタイムを使用した推論最適化の実装を提供します。コードの1行のみを使用して、〜2倍のスピードアップを取得できます。
SDK onnxruntime-gpu最適化に必要です。このパッケージのインストールは面倒です。また、環境固有のエラーや予期しないパフォーマンスがある場合があります。しかし、実際のシナリオでは、これはサーバー側のブラックボックスの一部です。
次のコードは、ドライバーバージョンを備えたNVIDIA GeForce RTX 3090 GPUで環境を構成するのに適しています:470.82.00およびCUDAバージョン:11.4。
pip install transformers==4.1.1
pip install datasets
pip install fastNLP
pip install cma
pip install sklearn
pip3 install torch --extra-index-url https://download.pytorch.org/whl/cu113
pip install onnx
pip install onnxruntime-gpu==1.10.0
pip install coloredlogs
pip install sympy PyTorchに基づいてBBTモデルをONNXモデルにエクスポートするには、すべての引数をデフォルトに設定してデモONNXモデルを取得するように設定されたexport_and_optimize.pyを実行できます。
python export_and_optimize.py 2つのモデルは./onnx_models/ 、つまりエクスポート(加速されていない)および最適化されたモデルに保存されます。その後、 run.sh変更できます。パラメーターinference_framework 'ort'に、 onnx_model_pathに<Your model path>に設定することにより、BBTのより速いバージョンの準備が整います。これが例です。
python bbt.py
--task_name " sst2 "
--n_prompt_tokens 50
--intrinsic_dim 500
--k_shot 16
--device " cuda:0 "
--seed 42
--loss_type " ce "
--cat_or_add " add "
--budget 8000
--print_every 50
--eval_every 100
--inference_framework ' ort '
--onnx_model_path ' ./onnx_models/optimized_model.onnx 'モデルの最適化に柔軟性を追加するために、 export_and_optimize.pyにいくつかのオプションを提供しました。これらの引数をexport_and_optimize.shで調整できます。これが例です。
python export_and_optimize.py
--batch_size 32
--max_seq_len 128
--n_prompt_tokens 50
--prompt_embed_dim 1024
--cat_or_add " add "
--exported_model_name ' model '
--optimized_model_name ' optimized_model 'ONNXモデルは静的ですが、CATまたは追加することはモデルのブランチです。構築フェーズ中、モデルグラフの未使用のノードが削除され、パフォーマンスが向上します。したがって、各モードに1つを構築する必要があります。
トレーニング時間が8.9±0.15分であるBBTのPytorchバージョンと比較して、次の結果を4.3±0.1分で取得できます(ハードウェア設定に依存します)
SST2でBBTを100回実行することで、次の結果を得ることができます。ランダムシードセットは1から100にセットされています。FP16最適化は、すべてのタスクのパフォーマンスを損なうことはありません。
| SST-2分割 | 最高の精度 |
|---|---|
| テスト | 88.0% |
この作品が役立つと思われる場合は、引用してください。
@inproceedings { sun2022bbt ,
title = { Black-Box Tuning for Language-Model-as-a-Service } ,
author = { Tianxiang Sun and Yunfan Shao and Hong Qian and Xuanjing Huang and Xipeng Qiu } ,
booktitle = { Proceedings of {ICML} } ,
year = { 2022 }
} @inproceedings { sun2022bbtv2 ,
title = { BBTv2: Towards a Gradient-Free Future with Large Language Models } ,
author = { Tianxiang Sun and Zhengfu He and Hong Qian and Yunhua Zhou and Xuanjing Huang and Xipeng Qiu } ,
booktitle = { Proceedings of {EMNLP} } ,
year = { 2022 }
}