deepbbt.py ?Black-Box Tuning (BBT) adalah metode bebas gradien untuk mengendarai model bahasa besar (LLM) untuk pembelajaran beberapa shot. Ini mengoptimalkan urutan token prompt lunak yang dipersiapkan dengan input LLM, tanpa memerlukan gradien/propagasi kembali dari LLMS. Oleh karena itu, LLM yang telah dilatih secara umum dapat dilihat sebagai model kotak hitam dan digunakan secara efisien pada beberapa server inferensi. Dalam skenario seperti itu, yang kami sebut model-model-as-a-service (LMAAS), BBT dapat mencapai kinerja yang sebanding dengan penyetelan model penuh dengan hanya mengakses API inferensi model. Secara umum, BBT dapat mencapai hasil yang cukup besar pada sebagian besar set data pemahaman dalam 8K Model Forward.
Rincian lebih lanjut disediakan dalam tuning kotak hitam ICML kami untuk model-model-as-a-service dan EMNLP Paper BBTV2 kami: Menuju masa depan bebas gradien dengan model bahasa besar.
Untuk membantu mereproduksi hasil yang dilaporkan dalam makalah ini, kami juga merilis kinerja Google Sheets yang merekam kinerja BBTV2 pada setiap dataset menggunakan setiap biji acak. Jangan ragu untuk menjangkau saya jika Anda tidak dapat memperoleh hasil yang serupa.
Implementasi penyetelan kotak hitam cukup sederhana, Anda dapat memeriksa kode kami dan dengan mudah mengimplementasikannya di lingkungan Anda sendiri. Atau Anda dapat membuat lingkungan baru untuk menjalankan implementasi kami berdasarkan pycma , Transformers dan FastNLP . Secara opsional, Anda dapat menggunakan fitlog untuk memantau hasil eksperimen. Anda dapat melepaskan jalur yang terkait dengan Fitlog dalam kode kami untuk menggunakannya.
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 Sekarang Anda dapat menjalankan tuning kotak hitam dengan run.sh :
bash run.shSecara umum, Anda akan mendapatkan hasil berikut dalam ~ 13 menit (diuji pada NVIDIA 3090 GPU):
| SST-2 Split | Akurasi terbaik |
|---|---|
| Kereta | 100 % |
| Dev | 96,88 % |
| Tes | 90,48 % |
Untuk mereproduksi eksperimen lain dalam makalah kami, ubah argumen bbt.py , misalnya,
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 Untuk mendapatkan hasil yang serupa seperti yang dilaporkan dalam makalah asli, kami sarankan menggunakan --loss_type "hinge" untuk tugas-tugas pasangan kalimat (yaitu, MRPC, SNLI, dan RTE) dan menggunakan --budget 20000 untuk dbpedia.
Selain itu, penyetelan kotak hitam juga mendukung evaluasi paralel. Artinya, Anda dapat mengevaluasi populasi solusi secara paralel dengan menempatkan mereka ke dalam satu batch besar. Misalnya,
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 adalah versi BBT yang lebih baik. Alih-alih mengoptimalkan prompt hanya di lapisan input, BBTV2 mengadopsi algoritma divide-and-conquer untuk mengoptimalkan petunjuk secara bergantian di setiap lapisan (yaitu, prompt yang dalam). Anda cukup mencoba BBTV2 menggunakan perintah berikut,
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 biasanya memberikan hasil yang lebih baik pada banyak tugas klasifikasi label (mis. Periksa Google Sheets kami jika Anda memiliki masalah yang mereproduksi hasil BBTV2.
Berbeda dengan pelatihan dengan keturunan gradien, BBT (dan BBTV2) hanya memerlukan komputasi model ke depan, dan oleh karena itu dapat dipercepat secara signifikan menggunakan OnNX Runtime atau NVIDIA TensorRT.
Di sini kami menyediakan implementasi optimasi inferensi menggunakan runtime ONNX. Anda dapat memperoleh ~ 2x speedup hanya menggunakan satu baris kode.
SDK onnxruntime-gpu diperlukan untuk optimasi. Instalasi paket ini bisa merepotkan. Dan mungkin ada beberapa kesalahan khusus lingkungan atau kinerja yang tidak terduga. Namun dalam skenario dunia nyata, ini adalah bagian dari kotak hitam di sisi server.
Kode berikut berfungsi dengan baik untuk mengonfigurasi lingkungan pada GPU NVIDIA GeForce RTX 3090 dengan Versi Driver: 470.82.00 dan CUDA Versi: 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 Untuk mengekspor model BBT berdasarkan PyTorch ke model ONNX , Anda dapat menjalankan export_and_optimize.py dengan semua argumen yang diatur ke default untuk mendapatkan model Demo Onnx.
python export_and_optimize.py Dua model akan disimpan ke ./onnx_models/ , yaitu diekspor (tidak dipercepat) dan model yang dioptimalkan. Maka Anda dapat memodifikasi run.sh Dengan mengatur parameter inference_framework ke 'ort' dan onnx_model_path ke <Your model path> , versi BBT yang lebih cepat siap. Inilah contohnya.
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 ' Untuk menambahkan beberapa fleksibilitas untuk memodelkan optimasi, kami menyediakan beberapa opsi di export_and_optimize.py . Anda dapat menyesuaikan argumen ini di export_and_optimize.sh . Inilah contohnya.
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 'Model ONNX statis, tetapi untuk kucing atau menambahkan adalah cabang dalam model. Selama fase bangunan, node yang tidak digunakan dalam grafik model dihapus untuk kinerja yang lebih baik. Jadi, Anda harus membangun satu untuk setiap mode.
Anda bisa mendapatkan hasil berikut dalam 4,3 ± 0,1 menit, dibandingkan dengan versi BBT Pytorch yang waktu pelatihannya 8,9 ± 0,15 menit (tergantung pada pengaturan perangkat keras)
Anda bisa mendapatkan hasil berikut dengan menjalankan BBT 100 kali pada SST2 dengan set benih acak dari 1 hingga 100. Optimalisasi FP16 tidak merugikan kinerja pada semua tugas.
| SST-2 Split | Akurasi terbaik |
|---|---|
| Tes | 88,0 % |
Jika Anda menganggap pekerjaan ini bermanfaat, silakan kutip:
@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 }
}