deepbbt.py ؟يعد ضبط الصندوق الأسود (BBT) طريقة خالية من التدرج لدفع نماذج لغة كبيرة (LLMS) للتعلم قليلًا. يعمل على تحسين سلسلة من الرموز المثيرة الناعمة المسبقة لإدخال LLMs ، دون الحاجة إلى التدرجات/الانتشار الخلفي لـ LLMs. لذلك ، يمكن اعتبار LLMs التي تم تدريبها قبل التدريب على أنها نماذج صناديق سوداء ونشرها بكفاءة على بعض خوادم الاستدلال. في مثل هذا السيناريو ، الذي نسميه نموذج اللغة كخدمة (LMAAs) ، يمكن لـ BBT تحقيق أداء مماثل لضبط النماذج الكاملة فقط عن طريق الوصول إلى واجهات برمجة تطبيقات الاستدلال النموذجية فقط. بشكل عام ، يمكن لـ BBT تحقيق نتائج كبيرة على معظم مجموعات بيانات فهم اللغة ضمن تمريرات النموذج الأمامي 8K.
يتم توفير مزيد من التفاصيل في ضبط صندوق ICML الخاص بنا من أجل خدمة اللغة كخدمة وورقة EMNLP 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 :
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 لـ 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 100عادةً ما يمنح BBTV2 نتائج أفضل على العديد من مهام تصنيف الملصقات (مثل ، DBPedia) ومهام الاستنتاجات (على سبيل المثال ، MRPC ، SNLI ، RTE ، إلخ). تحقق من أوراق Google الخاصة بنا إذا كان لديك مشكلة في إعادة إنتاج نتائج BBTV2.
على النقيض من التدريب مع نزول التدرج ، يتطلب BBT (و BBTV2) فقط حسابًا للأمام النموذجية ، وبالتالي يمكن تسريعه بشكل كبير باستخدام وقت تشغيل ONNX أو 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 عن طريق تعيين المعلمة 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 دقيقة ، مقارنةً بإصدار Pytorch من BBT الذي يبلغ وقت التدريب 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 }
}