deepbbt.py probieren?Die Black-Box-Tuning (BBT) ist eine gradientenfreie Methode, um große Sprachmodelle (LLMs) für wenige Lernen voranzutreiben. Es optimiert eine Abfolge von Soft-Eingabeaufentwicklern, die auf die Eingabe von LLMs vorbereitet werden, ohne Gradienten/Rückbefugnissen der LLMs zu erfordern. Daher können vorgeborene allgemein ausgebaute LLMs als Black-Box-Modelle angesehen und auf einigen Inferenzservern effizient bereitgestellt werden. In einem solchen Szenario, das wir als Sprachmodell-as-a-Service (LMAAS) bezeichnen, kann BBT eine vergleichbare Leistung für die vollständige Modellabstimmung erzielen, indem nur auf Modellinferenz-APIs zugreifen. Im Allgemeinen kann BBT erhebliche Ergebnisse zu den meisten Sprachverständnisdatensätzen innerhalb von 8K -Modellvertretern erzielen.
Weitere Details finden Sie in unserem ICML-Papier-Black-Box-Tuning für Sprachmodell-AS-A-Service und unserem EMNLP-Papier BBTV2: Auf dem Weg zu einer gradientenfreien Zukunft mit großen Sprachmodellen.
Um die in der Arbeit gemeldeten Ergebnisse zu reproduzieren, veröffentlichen wir auch eine Google Sheets, die die BBTV2 -Leistung auf jedem Datensatz mit jedem zufälligen Saatgut aufzeichnet. Wenden Sie sich gerne an mich, wenn Sie keine ähnlichen Ergebnisse erzielen können.
Die Implementierung von Black-Box-Tuning ist recht einfach. Sie können unseren Code überprüfen und ihn einfach in Ihrer eigenen Umgebung implementieren. Oder Sie können eine neue Umgebung erstellen, um unsere Implementierung auf der Grundlage von pycma , Transformers und FastNLP auszuführen. Optional können Sie fitlog verwenden, um experimentelle Ergebnisse zu überwachen. Sie können die Fitlog-bezogenen Zeilen in unserem Code für die Verwendung in Konkmentieren.
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 Jetzt können Sie Black-Box-Tuning mit run.sh ausführen:
bash run.shIm Allgemeinen erhalten Sie die folgenden Ergebnisse in ~ 13 Minuten (getestet auf NVIDIA 3090 GPU):
| SST-2-Split | Beste Genauigkeit |
|---|---|
| Zug | 100 % |
| Dev | 96,88 % |
| Prüfen | 90,48 % |
Um andere Experimente in unserem Artikel zu reproduzieren, ändern Sie beispielsweise die Argumente von 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 Um ähnliche Ergebnisse zu erhalten, wie im Originalpapier berichtet, empfehlen wir die Verwendung --loss_type "hinge" für Satzpaaraufgaben (dh MRPC, SNLI und RTE) und verwenden --budget 20000 für dbpedia.
Darüber hinaus unterstützt die Black-Box-Tuning auch die parallele Bewertung. Das heißt, Sie können eine Population von Lösungen parallel bewerten, indem Sie sie in eine einzige große Charge versetzen. Zum Beispiel,
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 ist eine verbesserte Version von BBT. Anstatt die Eingabeaufforderung lediglich in der Eingangsschicht zu optimieren, nimmt BBTV2 einen Divide-and-Conquer-Algorithmus an, um die Eingabeaufforderungen in jeder Schicht abwechselnd zu optimieren (dh eine tiefe Eingabeaufforderung). Sie können einfach BBTV2 verwenden, indem Sie den folgenden Befehl verwenden.
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 verleiht in der Regel bessere Ergebnisse bei vielen Aufgaben der Etikettenklassifizierung (z. B. DBpedia) und mit Aufgaben (z. B. MRPC, SNLI, RTE usw.). Überprüfen Sie unsere Google -Blätter, wenn Sie Probleme haben, die Ergebnisse von BBTV2 zu reproduzieren.
Im Gegensatz zum Training mit Gradientenabstieg erfordert BBT (und BBTV2) nur eine Modellwächterberechnung und kann daher unter Verwendung von ONNX -Laufzeit oder Nvidia Tensorrt erheblich beschleunigt werden.
Hier bieten wir eine Implementierung der Inferenzoptimierung mithilfe der ONNX -Laufzeit. Sie können ~ 2x Beschleunigung mit nur einer Codezeile erhalten.
SDK onnxruntime-gpu ist für die Optimierung erforderlich. Die Installation dieses Pakets kann problematisch sein. Und es kann einige umweltspezifische Fehler oder eine unerwartete Leistung geben. In realen Szenarien ist dies jedoch ein Teil der Black Box auf der Serverseite.
Der folgende Code funktioniert gut, um die Umgebung in einer NVIDIA Geforce RTX 3090 GPU mit Treiberversion: 470.82.00 und CUDA -Version: 11.4 zu konfigurieren.
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 Um ein BBT -Modell zu exportieren, das auf PyTorch in ein ONNX -Modell basiert, können Sie export_and_optimize.py mit allen auf standardmäßigen Argumenten festgelegten Argumenten ausführen, um ein Demo -ONNX -Modell zu erhalten.
python export_and_optimize.py Zwei Modelle werden auf ./onnx_models/ gespeichert, nämlich exportiert (nicht beschleunigt) und optimiertes Modell. Dann können Sie run.sh ändern. Durch Einstellen von Parameter inference_framework auf 'ort' und onnx_model_path zu <Your model path> ist eine schnellere Version von BBT bereit. Hier ist ein Beispiel.
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 ' Um der Modelloptimierung eine gewisse Flexibilität hinzuzufügen, haben wir einige Optionen in export_and_optimize.py bereitgestellt. Sie können diese Argumente in export_and_optimize.sh anpassen. Hier ist ein Beispiel.
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 -Modelle sind statisch, aber um zu katzen oder hinzuzufügen, ist ein Zweig im Modell. Während der Bauphase werden unbenutzte Knoten im Modelldiagramm zur besseren Leistung entfernt. Sie müssen also für jeden Modus eine erstellen.
Sie können die folgenden Ergebnisse in 4,3 ± 0,1 Minuten im Vergleich zur Pytorch -Version von BBT erhalten, deren Trainingszeit 8,9 ± 0,15 Minuten beträgt (abhängig von den Hardwareeinstellungen)
Sie können die folgenden Ergebnisse erhalten, indem Sie BBT 100 -mal auf SST2 mit zufälliger Saatgut von 1 auf 100 ausführen. Die FP16 -Optimierung schadet die Leistung bei allen Aufgaben nicht.
| SST-2-Split | Beste Genauigkeit |
|---|---|
| Prüfen | 88,0 % |
Wenn Sie diese Arbeit hilfreich finden, zitieren Sie bitte:
@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 }
}