deepbbt.py嘗試一下?Black-Box Tuning(BBT)是一種用於驅動大型語言模型(LLMS)的無梯度方法,以進行幾次學習。它優化了一系列軟提示令牌,而無需梯度/反向傳播,即LLMS的輸入。因此,可以將預訓練的通用LLM視為黑盒模型,並在某些推理服務器上有效部署。在這種情況下,我們稱之為語言模型AS-A-Service(LMAAS),BBT可以通過僅訪問模型推理API來實現與完整模型調整相當的性能。通常,BBT可以在8K模型前進中的大多數語言理解數據集中取得相當大的結果。
我們的ICML紙上黑框調整提供了更多詳細信息,用於語言模型,即服務和我們的EMNLP Paper BBTV2:朝著具有大語言模型的無梯度未來。
為了幫助重現本文報告的結果,我們還使用每個隨機種子發布了一個Google表,在每個數據集上記錄BBTV2性能。如果您無法獲得類似的結果,請隨時與我聯繫。
黑框調整的實現非常簡單,您可以檢查我們的代碼並在您自己的環境中輕鬆實現。或者,您可以創建一個新的環境,以基於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運行Black-Box調整:
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),並使用--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 TENSORRT來顯著加速。
在這裡,我們使用ONNX運行時提供了推理優化的實現。您只能使用一行代碼獲得〜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模型,您可以在所有參數設置為export_and_optimize.py值以獲取DEMO ONNX模型的所有參數。
python export_and_optimize.py兩個模型將被保存到./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或添加是模型中的分支。在構建階段,刪除模型圖中未使用的節點以提高性能。因此,您必須為每個模式構建一個。
與BBT的Pytorch版本相比,您可以在4.3±0.1分鐘內獲得以下結果,該版本的訓練時間為8.9±0.15分鐘(取決於硬件設置)
您可以通過在SST2上100次運行BBT,將隨機種子從1到100設置為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 }
}