deepbbt.py ?Tuning Black-Box (BBT)-это метод без градиентов для управления большими языковыми моделями (LLMS) для нескольких выстрелов. Он оптимизирует последовательность мягких токенов, приготовленных к вводу LLMS, не требуя градиентов/обратного распространения LLMS. Следовательно, предварительно обученные общие LLMS можно рассматривать как модели черного ящика и эффективно развернуть на некоторых серверах локали. В таком сценарии, который мы называем языковой моделью-моделью как услуга (LMAAS), BBT может достичь сопоставимой производительности с полной настройкой модели, только доступа к API модели. Как правило, BBT может достичь значительных результатов по большинству наборов данных по пониманию языка в рамках проходов модели 8K.
Более подробная информация приведена в нашей настройке черной коробки ICML для языковой модели как услуга и нашей бумаги EMNLP BBTV2: к будущему без градиентов с большими языковыми моделями.
Чтобы помочь воспроизвести результаты, представленные в статье, мы также выпускаем Google Sheets, записывающую производительность 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 :
bash run.shВ общем, вы получите следующие результаты за ~ 13 минут (проверено на GPU NVIDIA 3090):
| 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" для задач с предложением (IE, MRPC, SNLI и RTE) и использования --budget 20000 для Dbpedia.
Кроме того, настройка черного ящика также поддерживает параллельную оценку. То есть вы можете оценить популяцию решений параллельно, поместив их в одну большую партию. Например,
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) и задачах Entailment (например, MRPC, SNLI, RTE и т. Д.). Проверьте наши Google Sheets, если у вас есть проблемы, воспроизводящие результаты BBTV2.
В отличие от тренировок с градиентным происхождением, BBT (и BBTV2) требует только модельных вычислений вперед, и, следовательно, может быть значительно ускорен с использованием ONNX Runting или Nvidia Tensorrt.
Здесь мы предоставляем реализацию оптимизации вывода с использованием времени выполнения ONNX. Вы можете получить ~ 2x ускорения, используя только одну строку кода.
SDK onnxruntime-gpu требуется для оптимизации. Установка этого пакета может быть неприятной. И могут быть некоторые ошибки, специфичные для окружающей среды или неожиданные результаты. Но в реальных сценариях это является частью черного ящика на стороне сервера.
Следующий код хорошо работает для настройки среды на GPU NVIDIA GeForce RTX 3090 с версией драйвера: 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 Чтобы экспортировать модель BBT, основанную на PyTorch в модель ONNX , вы можете запустить export_and_optimize.py со всеми аргументами, установленными для дефолта, чтобы получить демонстрационную модель ONNX.
python export_and_optimize.py Две модели будут сохранены на ./onnx_models/ Тогда вы можете изменить run.sh Установив параметр parameter 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 статичны, но для кошки или добавления - это ветвь в модели. Во время фазы здания неиспользованные узлы на графике модели удаляются для лучшей производительности. Таким образом, вы должны построить один для каждого режима.
Вы можете получить следующие результаты за 4,3 ± 0,1 минуты по сравнению с версией BBT Pytorch, чье время обучения составляет 8,9 ± 0,15 минуты (зависит от настройки аппаратного обеспечения)
Вы можете получить следующие результаты, выполнив BBT 100 раз на SST2 со случайным набором семян от 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 }
}