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 }
}