PEFT documentation
التكيّف منخفض الرتبة المُفكّك الأوزان (DoRA)
التكيّف منخفض الرتبة المُفكّك الأوزان (DoRA)
هذا متغيّر من LoRA، وبالتالي كل ما هو ممكن باستخدام LoRA صالح لهذه الطريقة ما لم يُذكر خلاف ذلك في هذه الصفحة.
تقوم هذه التقنية بتفكيك تحديثات الأوزان إلى جزأين: المقدار والاتجاه. يُعالَج الاتجاه بواسطة LoRA العادي، بينما يُعالَج المقدار بواسطة معامل قابل للتعلم منفصل. يمكن أن يحسّن هذا أداء LoRA، لا سيما عند استخدام رتب منخفضة. لمزيد من المعلومات حول DoRA، راجع https://huggingface.co/papers/2402.09353.
from peft import LoraConfig
config = LoraConfig(use_dora=True, ...)إذا تم نقل أجزاء من النموذج أو مُكيّف DoRA إلى وحدة المعالجة المركزية (CPU)، يمكنك الحصول على تسريع كبير مقابل بعض العبء المؤقت (الزائل) على ذاكرة الفيديو (VRAM) من خلال استخدام ephemeral_gpu_offload=True في config.runtime_config.
from peft import LoraConfig, LoraRuntimeConfig
config = LoraConfig(use_dora=True, runtime_config=LoraRuntimeConfig(ephemeral_gpu_offload=True), ...)يمكن أيضًا تحميل PeftModel مزوّد بمحوّل DoRA باستخدام علم ephemeral_gpu_offload=True من خلال كلٍّ من طريقة from_pretrained وطريقة load_adapter.
from peft import PeftModel
model = PeftModel.from_pretrained(base_model, peft_model_id, ephemeral_gpu_offload=True)التحسين
يتم تحسين DoRA (يُحسب بشكل أسرع ويستهلك ذاكرة أقل) للنماذج في وضع التقييم، أو عندما يكون dropout مضبوطاً على 0. نعيد استخدام النتيجة الأساسية في تلك الأوقات للحصول على تسريع.
أدى تشغيل دوران الدقيق (dora finetuning) باستخدام CUDA_VISIBLE_DEVICES=0 ZE_AFFINITY_MASK=0 time python examples/dora_finetuning/dora_finetuning.py --quantize --lora_dropout 0 --batch_size 16 --eval_step 2 --use_dora على بطاقة 4090 مع ضبط تراكم التدرجات على 2 والخطوة القصوى على 20 إلى الملاحظات التالية:
| بدون تحسين | مع التحسين | |
|---|---|---|
| زمن التدريب (بالثواني) | 359.7298 | 279.2676 |
| عينة تدريب في الثانية | 1.779 | 2.292 |
| خطوات التدريب في الثانية | 0.056 | 0.072 |
علاوة على ذلك، من الممكن زيادة أداء وقت التشغيل الخاص بـ DoRA بشكل أكبر من خلال استخدام سياق المساعدة DoraCaching. ويتطلب ذلك أن يكون النموذج في وضع eval:
from peft.helpers import DoraCaching
model.eval()
with DoraCaching():
output = model(inputs)في حالة meta-llama/Llama-3.1-8B، يُظهر سكربت معيار اختبار التخزين المؤقت لـ DoRA أنه، مقارنةً بـ LoRA:
- يتطلب DoRA دون التخزين المؤقت وقتاً أطول بنسبة 139%
- يتطلب DoRA دون التخزين المؤقت 4% إضافية من الذاكرة
- يتطلب استخدام DoRA مع التخزين المؤقت 17% من الوقت الإضافي
- يتطلب استخدام DoRA مع التخزين المؤقت 41% من الذاكرة الإضافية
وبالتالي، يمكن أن يجعل التخزين المؤقت (Caching) الاستدلال باستخدام DoRA أسرع بشكل كبير، لكنه يتطلب أيضًا ذاكرة أكبر بكثير. في المثالي، إذا سمحت حالة الاستخدام بذلك، قم بدمج مُكيّف DoRA لتجنب كل من عبء الذاكرة وعبء وقت التشغيل.
ملاحظات
- يدعم DoRA حاليًا طبقات التضمين (embedding) والخطية (linear) وطبقات Conv2d فقط.
- DoRA introduces a bigger overhead than pure LoRA, so it is recommended to merge weights for inference, see LoraModel.merge_and_unload().
- يجب أن يعمل DoRA مع الأوزان المُكمّمة باستخدام bitsandbytes (“QDoRA”). ومع ذلك، تم الإبلاغ عن مشاكل عند استخدام QDoRA مع DeepSpeed Zero2.