deepbbt.py ?Le réglage de la boîte noire (BBT) est une méthode sans gradient pour stimuler les modèles de grandes langues (LLMS) pour l'apprentissage à quelques coups. Il optimise une séquence de jetons rapides souples adjoints à l'entrée de LLMS, sans nécessiter de gradients / rétro-propagation des LLM. Par conséquent, les LLMs à service général pré-formées peuvent être considérés comme des modèles de boîte noire et déployés efficacement sur certains serveurs d'inférence. Dans un tel scénario, que nous appelons le langage-model-as-a-Service (LMAAS), BBT peut atteindre des performances comparables au réglage complet du modèle en accédant uniquement aux API d'inférence du modèle. Généralement, BBT peut obtenir des résultats considérables sur la plupart des ensembles de données de compréhension des langues dans les passes avant 8K du modèle.
Plus de détails sont fournis dans notre réglage de la boîte noire ICML Paper pour la langue-model-as-a-Service et notre papier EMNLP BBTV2: vers un avenir sans dégradé avec de grands modèles de langue.
Pour aider à reproduire les résultats rapportés dans le document, nous publions également une Google Sheets enregistrant les performances BBTV2 sur chaque ensemble de données en utilisant chaque graine aléatoire. N'hésitez pas à me contacter si vous ne pouvez pas obtenir de résultats similaires.
L'implémentation du réglage de la boîte noire est assez simple, vous pouvez vérifier notre code et l'implémenter facilement dans votre propre environnement. Ou vous pouvez créer un nouvel environnement pour exécuter notre implémentation en fonction de pycma , Transformers et FastNLP . Facultativement, vous pouvez utiliser fitlog pour surveiller les résultats expérimentaux. Vous pouvez décommenter les lignes liées à Fitlog dans notre code pour l'utiliser.
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 Vous pouvez maintenant exécuter un réglage de la boîte noire avec run.sh :
bash run.shEn général, vous obtiendrez les résultats suivants en ~ 13 minutes (testés sur le GPU NVIDIA 3090):
| SST-2 Split | Meilleure précision |
|---|---|
| Former | 100% |
| Dev | 96,88% |
| Test | 90,48% |
Pour reproduire d'autres expériences dans notre article, modifiez les arguments de bbt.py , par exemple,
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 Pour obtenir des résultats similaires indiqués dans l'article d'origine, nous vous recommandons d'utiliser --loss_type "hinge" pour les tâches de phrase (c'est-à-dire MRPC, SNLI et RTE) et en utilisant --budget 20000 pour DBPEDIA.
De plus, le réglage de la boîte noire prend également en charge l'évaluation parallèle. Autrement dit, vous pouvez évaluer une population de solutions en parallèle en les mettant en un seul grand lot. Par exemple,
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 est une version améliorée de BBT. Au lieu d'optimiser l'invite simplement dans la couche d'entrée, BBTV2 adopte un algorithme de division et de conquête pour optimiser alternativement les invites dans chaque couche (c'est-à-dire une invite profonde). Vous pouvez simplement essayer BBTV2 en utilisant la commande suivante,
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 confère généralement de meilleurs résultats sur de nombreuses tâches de classification des étiquettes (par exemple, DBpedia) et des tâches d'implication (par exemple, MRPC, SNLI, RTE, etc.). Vérifiez nos feuilles Google si vous avez des problèmes à reproduire les résultats de BBTV2.
Contrairement à la formation avec une descente de gradient, BBT (et BBTV2) ne nécessite que le calcul de la transmission du modèle, et peut donc être considérablement accéléré à l'aide de l'ONNX Runtime ou Nvidia Tensorrt.
Ici, nous fournissons une implémentation de l'optimisation des inférences à l'aide de l'ONNX Runtime. Vous pouvez obtenir ~ 2x accélération en utilisant une seule ligne de code.
Le SDK onnxruntime-gpu est requis pour l'optimisation. L'installation de ce package peut être gênante. Et il peut y avoir des erreurs spécifiques à l'environnement ou des performances inattendues. Mais dans les scénarios du monde réel, cela fait partie de la boîte noire du côté serveur.
Le code suivant fonctionne bien pour configurer l'environnement sur un GPU NVIDIA GEFORCE RTX 3090 avec version du pilote: 470.82.00 et CUDA Version: 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 Pour exporter un modèle BBT basé sur PyTorch vers un modèle ONNX , vous pouvez exécuter export_and_optimize.py avec tous les arguments définis par défaut pour obtenir un modèle ONNX de démo.
python export_and_optimize.py Deux modèles seront enregistrés sur ./onnx_models/ , à savoir le modèle exporté (non accéléré) et optimisé. Ensuite, vous pouvez modifier run.sh En définissant le paramètre inference_framework à 'ort' et onnx_model_path à <Your model path> , une version plus rapide de BBT est prête. Voici un exemple.
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 ' Pour ajouter une certaine flexibilité à l'optimisation du modèle, nous avons fourni certaines options dans export_and_optimize.py . Vous pouvez ajuster ces arguments dans export_and_optimize.sh . Voici un exemple.
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 'Les modèles ONNX sont statiques, mais pour chat ou ajouter est une branche du modèle. Pendant la phase de construction, les nœuds inutilisés dans le graphique du modèle sont supprimés pour de meilleures performances. Vous devez donc en créer un pour chaque mode.
Vous pouvez obtenir les résultats suivants en 4,3 ± 0,1 minutes, par rapport à la version Pytorch de BBT dont le temps de formation est de 8,9 ± 0,15 minutes (dépend des paramètres matériels)
Vous pouvez obtenir les résultats suivants en exécutant BBT 100 fois sur SST2 avec un ensemble de graines aléatoires de 1 à 100. L'optimisation FP16 ne nuit pas aux performances sur toutes les tâches.
| SST-2 Split | Meilleure précision |
|---|---|
| Test | 88,0% |
Si vous trouvez ce travail utile, veuillez citer:
@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 }
}