يحتوي هذا الريبو على الكود المصدري لحزمة Python loralib
والعديد من الأمثلة على كيفية دمجه مع نماذج Pytorch ، مثل تلك الموجودة في وجه المعانقة. نحن ندعم فقط Pytorch في الوقت الحالي. شاهد ورقتنا للحصول على وصف مفصل لورا.
لورا: التكيف منخفض الرتبة لنماذج اللغة الكبيرة
Edward J. Hu*، Yelong Shen*، Phillip Wallis ، Zeyuan Allen-Zhu ، Yuanzhi Li ، Shean Wang ، Lu Wang ، Weizhu Chen
ورقة: https://arxiv.org/abs/2106.09685
شرح الفيديو: https://www.youtube.com/watch؟v=dhrotoncyze
تحديث 2/2023: يتم دعم Lora الآن من خلال مكتبة النقل الدقيق (PEFT) المتوفرة على أحدث طراز عن طريق العناق.
يقلل Lora من عدد المعلمات القابلة للتدريب من خلال تعلم أزواج من مصفوفات التثبيت في المرتبة مع تجميد الأوزان الأصلية. هذا يقلل بشكل كبير من متطلبات التخزين لنماذج اللغة الكبيرة التي تم تكييفها مع مهام محددة ويتيح تبديل المهام الفعال أثناء النشر كل ذلك دون إدخال زمن الاستدلال. يتفوق Lora أيضًا على العديد من أساليب التكيف الأخرى بما في ذلك المحول ، وضبط البادئة ، والضبط.
نحصل على نتيجة قابلة للمقارنة أو متفوقة على التحويل الكامل على معيار الغراء باستخدام قاعدة روبرتا (Liu et al. ، 2019) و DeBerta (He et al. ، 2020) . انقر فوق الأرقام أدناه لتنزيل نقاط التفتيش Roberta و DeBerta Lora.
قاعدة روبرتا ضبط دقيق | قاعدة روبرتا لورا | ديبرتا XXL ضبط دقيق | ديبرتا XXL لورا | ||
---|---|---|---|---|---|
# من المعاملات القابلة للتدريب. | 125m | 0.8m | 1.5 ب | 4.7m | |
Mnli (M-ACC/MM-ACC) | 87.6 | 87.5 ± .3/86.9 ± .3 | 91.7/ 91.9 | 91.9 ± .1/ 91.9 ± .2 | |
SST2 (ACC) | 94.8 | 95.1 ± .2 | 97.2 | 96.9 ± .2 | |
MRPC (ACC) | 90.2 | 89.7 ± .7 | 92.0 | 92.6 ± .6 | |
كولا (ماثيو كور) | 63.6 | 63.4 ± 1.2 | 72.0 | 72.4 ± 1.1 | |
Qnli (ACC) | 92.8 | 93.3 ± .3 | 96.0 | 96.0 ± .1 | |
QQP (ACC) | 91.9 | 90.8 ± .1 | 92.7 | 92.9 ± .1 | |
RTE (ACC) | 78.7 | 86.6 ± .7 | 93.9 | 94.9 ± .4 | |
STSB (Pearson/Spearman Corr) | 91.2 | 91.5 ± .2/ 91.3 ± .2 | 92.9 /92.6 | 93.0 ± .2/ 92.9 ± .3 | |
متوسط | 86.40 | 87.24 | 91.06 | 91.32 |
ملاحظة: لا تزال بحاجة إلى نقطة تفتيش أصلية تم تدريبها مسبقًا من Hugging Face لاستخدام نقاط تفتيش Lora.
يتم أخذ أرقام الضبط الدقيقة من Liu et al. (2019) وهو وآخرون. (2020). ندرج فترات الثقة على نتائج تجاربنا. يرجى اتباع التعليمات الواردة في examples/NLU/
لإعادة إنتاج نتائجنا.
على GPT-2 ، تقارن Lora بشكل إيجابي مع كل من أساليب التوليف الكاملة وغيرها من طرق التوليف الفعالة ، مثل المحول (Houlsby et al. ، 2019) وضبط البادئة (Li and Liang ، 2021). قمنا بتقييم على E2E NLG Challenge و Dart و WebNLG:
طريقة | # من المعاملات القابلة للتدريب | e2e (bleu) | دارت (بلو) | webnlg (bleu-u/s/a) | |
---|---|---|---|---|---|
GPT-2 M (ضبطها) | 354.92m | 68.2 | 46.0 | 30.4 / 63.2 /47.6 | |
GPT-2 M (محول) | 0.37m | 66.3 | 42.4 | 45.1/54.5/50.2 | |
GPT-2 M (بادئة) | 0.35m | 69.7 | 45.7 | 44.1/63.1/54.4 | |
GPT-2 M (Lora) | 0.35m | 70.4 ± .1 | 47.1 ± .2 | 46.7 ± .4/ 62.1 ± .2/ 55.3 ± .2 | |
GPT-2 L (ضبطها) | 774.03m | 68.5 | 46.5 | 41.7 / 64.6 /54.2 | |
GPT-2 L (محول) | 0.88m | 69.1 ± .1 | 45.7 ± .1 | 49.8 ± .0/61.1 ± .0/56.0 ± .0 | |
GPT-2 L (بادئة) | 0.77M | 70.3 | 46.5 | 47.0/64.2/56.4 | |
GPT-2 L (Lora) | 0.77M | 70.4 ± .1 | 47.5 ± .1 | 48.4 ± .3/ 64.0 ± .3/ 57.0 ± .1 |
يتم أخذ خطوط الأساس غير Lora ، باستثناء المحول على GPT-2 الكبير ، من Li و Liang (2021). ندرج فترات الثقة على نتائج تجاربنا.
قم بتنزيل نقاط التفتيش GPT-2 Lora:
يرجى اتباع التعليمات في examples/NLG/
لإعادة إنتاج النتيجة.
(تم أرشفة الإصدار الأولي لهذا الريبو في الفرع "Snapshot-9-15-2021")
هناك العديد من الدلائل في هذا الريبو:
loralib
، والتي يجب تثبيتها لتشغيل الأمثلة التي نقدمها ؛loralib
في GPT-2 و Roberta و DeBerta V2 loralib
هو ببساطة pip install loralib
# Alternatively
# pip install git+https://github.com/microsoft/LoRA
loralib
. نحن ندعم فقط nn.Linear
و nn.Embedding
و nn.Conv2d
في الوقت الحالي. نحن ندعم أيضًا MergedLinear
للحالات التي يمثل فيها nn.Linear
واحد أكثر من طبقات ، كما هو الحال في بعض تطبيقات الإسقاط qkv
(انظر ملاحظات إضافية للمزيد). # ===== Before =====
# layer = nn.Linear(in_features, out_features)
# ===== After ======
import loralib as lora
# Add a pair of low-rank adaptation matrices with rank r=16
layer = lora . Linear ( in_features , out_features , r = 16 )
import loralib as lora
model = BigModel ()
# This sets requires_grad to False for all parameters without the string "lora_" in their names
lora . mark_only_lora_as_trainable ( model )
# Training loop
for batch in dataloader :
...
state_dict
تحتوي فقط على معلمات LORA. # ===== Before =====
# torch.save(model.state_dict(), checkpoint_path)
# ===== After =====
torch . save ( lora . lora_state_dict ( model ), checkpoint_path )
load_state_dict
، تأكد من تعيين strict=False
. # Load the pretrained checkpoint first
model . load_state_dict ( torch . load ( 'ckpt_pretrained.pt' ), strict = False )
# Then load the LoRA checkpoint
model . load_state_dict ( torch . load ( 'ckpt_lora.pt' ), strict = False )
على الرغم من أننا نركز على إعداد بسيط ولكنه تأثير ، وهو تكييف الإسقاط q
و v
فقط في محول ، في أمثلةنا ، يمكن تطبيق Lora على أي مجموعات فرعية من الأوزان التي تم تدريبها مسبقًا. نحن نشجعك على استكشاف تكوينات مختلفة ، مثل تكييف طبقة التضمين عن طريق استبدال nn.Embedding
مع lora.Embedding
و/أو تكييف طبقات MLP. من المحتمل جدًا أن يختلف التكوين الأمثل بالنسبة للبنية والمهام النموذجية المختلفة.
يستخدم بعض تنفيذ المحولات nn.Linear
واحد لمصفوفات الإسقاط للاستعلام والمفتاح والقيمة. إذا كان المرء يرغب في تقييد رتبة التحديثات على المصفوفات الفردية ، فيجب على المرء إما تقسيمها إلى ثلاث مصفوفات منفصلة أو استخدام lora.MergedLinear
. تأكد من تعديل نقطة التفتيش وفقًا لذلك إذا اخترت تفكيك الطبقة.
# ===== Before =====
# qkv_proj = nn.Linear(d_model, 3*d_model)
# ===== After =====
# Break it up (remember to modify the pretrained checkpoint accordingly)
q_proj = lora . Linear ( d_model , d_model , r = 8 )
k_proj = nn . Linear ( d_model , d_model )
v_proj = lora . Linear ( d_model , d_model , r = 8 )
# Alternatively, use lora.MergedLinear (recommended)
qkv_proj = lora . MergedLinear ( d_model , 3 * d_model , r = 8 , enable_lora = [ True , False , True ])
lora
. يمكنك وضع علامة على بعض التحيزات على أنها قابلة للتدريب من خلال تمرير "الكل" أو "lora_only" إلى bias=
عند استدعاء mark_only_lora_as_trainable
. تذكر تمرير bias=
وسيطة إلى lora_state_dict
عند حفظ نقطة تفتيش. # ===== Before =====
# lora.mark_only_lora_as_trainable(model) # Not training any bias vectors
# ===== After =====
# Training all bias vectors associated with modules we apply LoRA to
lora . mark_only_lora_as_trainable ( model , bias = 'lora_only' )
# Alternatively, we can train *all* bias vectors in the model, including LayerNorm biases
lora . mark_only_lora_as_trainable ( model , bias = 'all' )
# When saving a checkpoint, use the same bias= ('all' or 'lora_only')
torch . save ( lora . lora_state_dict ( model , bias = 'all' ), checkpoint_path )
model.eval()
استدعاء model.train()
مرة أخرى سوف تراجع عن الدمج. يمكن تعطيل ذلك عن طريق تمرير merge_weights=False
في طبقات Lora. يرجى الاتصال بنا أو نشر مشكلة إذا كان لديك أي أسئلة.
للأسئلة المتعلقة بالحزمة loralib
:
مثال GPT-2:
مثال روبرتا/ديبرتا:
نشكر بالترتيب الأبجدي Jianfeng Gao و Jade Huang و Jiayuan Huang و Lisa Xiang Li و Xiaodong Liu و Yabin Liu و Benjamin Van Durme و Luis Vargas و Haoran Wei و Peter Welinder و Greg Yang لتوفير ردود الفعل القيمة.
@inproceedings {
hu2022lora,
title = { Lo{RA}: Low-Rank Adaptation of Large Language Models } ,
author = { Edward J Hu and Yelong Shen and Phillip Wallis and Zeyuan Allen-Zhu and Yuanzhi Li and Shean Wang and Lu Wang and Weizhu Chen } ,
booktitle = { International Conference on Learning Representations } ,
year = { 2022 } ,
url = { https://openreview.net/forum?id=nZeVKeeFYf9 }
}
يرحب هذا المشروع بالمساهمات والاقتراحات. تطلب منك معظم المساهمات الموافقة على اتفاقية ترخيص المساهم (CLA) مع إعلان أن لديك الحق في ذلك في الواقع ، ويفعلنا في الواقع حقوق استخدام مساهمتك. لمزيد من التفاصيل ، تفضل بزيارة https://cla.opensource.microsoft.com.
عند إرسال طلب سحب ، سيحدد CLA Bot تلقائيًا ما إذا كنت بحاجة إلى توفير CLA وتزيين العلاقات العامة بشكل مناسب (على سبيل المثال ، فحص الحالة ، التعليق). ببساطة اتبع الإرشادات التي يقدمها الروبوت. ستحتاج فقط إلى القيام بذلك مرة واحدة عبر جميع عمليات إعادة الشراء باستخدام CLA لدينا.
اعتمد هذا المشروع رمز سلوك المصدر المفتوح Microsoft. لمزيد من المعلومات ، راجع مدونة الشهادة الأسئلة الشائعة أو الاتصال بـ [email protected] مع أي أسئلة أو تعليقات إضافية.