repo นี้มีซอร์สโค้ดของแพ็คเกจ Python loralib
และตัวอย่างหลายประการของวิธีการรวมเข้ากับโมเดล pytorch เช่นที่อยู่ในใบหน้ากอด ตอนนี้เราสนับสนุน Pytorch เท่านั้น ดูเอกสารของเราสำหรับคำอธิบายโดยละเอียดของ Lora
LORA: การปรับระดับต่ำของแบบจำลองภาษาขนาดใหญ่
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 ยังมีประสิทธิภาพสูงกว่าวิธีการปรับตัวอื่น ๆ อีกหลายวิธีรวมถึงอะแดปเตอร์คำนำหน้าการปรับแต่งและการปรับแต่ง
เราได้ผลลัพธ์ที่เทียบเท่าหรือเหนือกว่า finetuning เต็มรูปแบบบนเกณฑ์มาตรฐานกาวโดยใช้ Roberta (Liu et al., 2019) และขนาดใหญ่และ Deberta (He et al., 2020) XXL 1.5B ในขณะที่การฝึกอบรมและจัดเก็บเศษส่วนของพารามิเตอร์ . คลิกที่หมายเลขด้านล่างเพื่อดาวน์โหลดจุดตรวจ Roberta และ Deberta Lora
ฐานโรเบอร์ต้า ปรับแต่ง | ฐานโรเบอร์ต้า Lora | deberta xxl ปรับแต่ง | deberta xxl Lora | ||
---|---|---|---|---|---|
# ของพารามิเตอร์ที่สามารถฝึกอบรมได้ | 125m | 0.8m | 1.5B | 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 | |
Cola (Matthew's Corr) | 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 |
หมายเหตุ: คุณยังต้องใช้จุดตรวจสอบที่ผ่านการฝึกอบรมมาก่อนจากการกอดเพื่อใช้จุดตรวจ LORA
ตัวเลขการปรับแต่งถูกนำมาจาก Liu และคณะ (2019) และเขาและคณะ (2020) เรารวมช่วงความมั่นใจเกี่ยวกับผลลัพธ์จากการทดลองของเรา โปรดทำตามคำแนะนำใน examples/NLU/
เพื่อทำซ้ำผลลัพธ์ของเรา
ใน GPT-2 LORA เปรียบเทียบได้ดีกับทั้ง finetuning เต็มรูปแบบและวิธีการปรับแต่งที่มีประสิทธิภาพอื่น ๆ เช่นอะแดปเตอร์ (Houlsby et al., 2019) และการปรับแต่งคำนำหน้า (Li and Liang, 2021) เราประเมินความท้าทาย E2E NLG, DART และ WEBNLG:
วิธี | # ของ params ที่ฝึกอบรมได้ | E2E (bleu) | Dart (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 |
Non-Lora baselines ยกเว้นอะแดปเตอร์บน GPT-2 ขนาดใหญ่ถูกนำมาจาก Li และ Liang (2021) เรารวมช่วงความมั่นใจเกี่ยวกับผลลัพธ์จากการทดลองของเรา
ดาวน์โหลดจุดตรวจ GPT-2 Lora:
โปรดทำตามคำแนะนำใน examples/NLG/
เพื่อทำซ้ำผลลัพธ์ของเรา
(การเปิดตัวครั้งแรกของ repo นี้ได้รับการเก็บถาวรในสาขา "snapshot-9-15-2021")
มีหลายไดเรกทอรีใน repo นี้:
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()
จะกระตุ้นการรวมพารามิเตอร์ LORA กับตัวแปรที่เกี่ยวข้องซึ่งจะช่วยลดเวลาแฝงเพิ่มเติมสำหรับการส่งต่อไปข้างหน้า Calling model.train()
อีกครั้งจะยกเลิกการผสาน สิ่งนี้สามารถปิดการใช้งานได้โดยผ่าน merge_weights=False
to Lora Layers กรุณาติดต่อเราหรือโพสต์ปัญหาหากคุณมีคำถามใด ๆ
สำหรับคำถามที่เกี่ยวข้องกับแพ็คเกจ loralib
:
ตัวอย่าง GPT-2:
ตัวอย่าง Roberta/Deberta:
เราขอขอบคุณในลำดับตัวอักษร 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 บอทจะพิจารณาโดยอัตโนมัติว่าคุณจำเป็นต้องให้ CLA และตกแต่ง PR อย่างเหมาะสม (เช่นการตรวจสอบสถานะแสดงความคิดเห็น) เพียงทำตามคำแนะนำที่จัดทำโดยบอท คุณจะต้องทำสิ่งนี้เพียงครั้งเดียวใน repos ทั้งหมดโดยใช้ CLA ของเรา
โครงการนี้ได้นำรหัสการดำเนินงานของ Microsoft โอเพ่นซอร์สมาใช้ สำหรับข้อมูลเพิ่มเติมโปรดดูจรรยาบรรณคำถามที่พบบ่อยหรือติดต่อ [email protected] พร้อมคำถามหรือความคิดเห็นเพิ่มเติมใด ๆ