Repo ini berisi kode sumber paket Python loralib
dan beberapa contoh cara mengintegrasikannya dengan model Pytorch, seperti yang ada di wajah memeluk. Kami hanya mendukung Pytorch untuk saat ini. Lihat makalah kami untuk deskripsi terperinci tentang Lora.
Lora: Adaptasi Rendah dari Model Bahasa Besar
Edward J. Hu*, Yelong Shen*, Phillip Wallis, Zeyuan Allen-Zhu, Yuanzhi Li, Shean Wang, Lu Wang, Weizhu Chen
Kertas: https://arxiv.org/abs/2106.09685
Penjelasan Video: https://www.youtube.com/watch?v=dhrotoncyze
UPDATE 2/2023: LORA sekarang didukung oleh perpustakaan fine-tuning-tuning (PEFT) yang canggih dengan memeluk wajah.
Lora mengurangi jumlah parameter yang dapat dilatih dengan mempelajari pasangan matriks dekomposisi peringkat sambil membekukan bobot asli. Ini sangat mengurangi persyaratan penyimpanan untuk model bahasa besar yang disesuaikan dengan tugas-tugas tertentu dan memungkinkan pengalihan tugas yang efisien selama penyebaran semua tanpa memperkenalkan latensi inferensi. Lora juga mengungguli beberapa metode adaptasi lainnya termasuk adaptor, tuning awalan, dan penyesuaian.
Kami memperoleh hasil yang sebanding atau lebih unggul dari finetuning penuh pada tolok ukur lem menggunakan Roberta (Liu et al., 2019) basis dan besar dan DeBerta (He et al., 2020) xxl 1.5b, sementara hanya melatih dan menyimpan sebagian kecil dari parameter . Klik nomor di bawah ini untuk mengunduh pos pemeriksaan Roberta dan DeBerta Lora.
Basis Roberta Fine-tune | Basis Roberta Lora | Deberta XXL Fine-tune | Deberta XXL Lora | ||
---|---|---|---|---|---|
# Param yang dapat dilatih. | 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 | |
Rata-rata | 86.40 | 87.24 | 91.06 | 91.32 |
Catatan: Anda masih membutuhkan pos pemeriksaan pra-terlatih asli dari wajah memeluk untuk menggunakan pos pemeriksaan LORA.
Nomor penyesuaian diambil dari Liu et al. (2019) dan He et al. (2020). Kami menyertakan interval kepercayaan pada hasil dari eksperimen kami. Harap ikuti instruksi dalam examples/NLU/
untuk mereproduksi hasil kami.
Pada GPT-2, LORA membandingkan baik dengan finetuning penuh dan metode tuning efisien lainnya, seperti adaptor (Houlsby et al., 2019) dan tuning awalan (Li dan Liang, 2021). Kami mengevaluasi E2E NLG Challenge, Dart, dan Webnlg:
Metode | # Paramsable Params | E2E (bleu) | Dart (bleu) | Webnlg (bleu-u/s/a) | |
---|---|---|---|---|---|
GPT-2 M (fine-tune) | 354.92m | 68.2 | 46.0 | 30.4 / 63.2 /47.6 | |
GPT-2 M (adaptor) | 0.37m | 66.3 | 42.4 | 45.1/54.5/50.2 | |
GPT-2 M (awalan) | 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 (fine-tune) | 774.03m | 68.5 | 46.5 | 41.7 / 64.6 /54.2 | |
GPT-2 L (adaptor) | 0.88m | 69.1 ± .1 | 45.7 ± .1 | 49,8 ± .0/61.1 ± .0/56.0 ± .0 | |
GPT-2 L (awalan) | 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 |
Baselines non-Lora, kecuali adaptor pada GPT-2 besar, diambil dari Li dan Liang (2021). Kami menyertakan interval kepercayaan pada hasil dari eksperimen kami.
Unduh pos pemeriksaan GPT-2 LORA:
Harap ikuti instruksi dalam examples/NLG/
untuk mereproduksi hasil kami.
(Rilis awal repo ini telah diarsipkan di cabang "Snapshot-9-15-2021")
Ada beberapa direktori dalam repo ini:
loralib
, yang perlu diinstal untuk menjalankan contoh yang kami berikan;loralib
di GPT-2, Roberta, dan DeBerta V2 loralib
itu sederhana pip install loralib
# Alternatively
# pip install git+https://github.com/microsoft/LoRA
loralib
. Kami hanya mendukung nn.Linear
, nn.Embedding
, dan nn.Conv2d
untuk saat ini. Kami juga mendukung MergedLinear
untuk kasus -kasus di mana satu nn.Linear
mewakili lebih dari satu lapisan, seperti dalam beberapa implementasi proyeksi perhatian qkv
(lihat catatan tambahan untuk lebih banyak). # ===== 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
yang hanya berisi parameter LORA. # ===== Before =====
# torch.save(model.state_dict(), checkpoint_path)
# ===== After =====
torch . save ( lora . lora_state_dict ( model ), checkpoint_path )
load_state_dict
, pastikan untuk mengatur 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 )
Meskipun kami fokus pada pengaturan yang sederhana namun efek, yaitu hanya mengadaptasi proyeksi q
dan v
dalam transformator, dalam contoh kami, LORA dapat diterapkan pada setiap himpunan bagian dari bobot terlatih. Kami mendorong Anda untuk mengeksplorasi konfigurasi yang berbeda, seperti mengadaptasi lapisan embedding dengan mengganti nn.Embedding
dengan lora.Embedding
dan/atau mengadaptasi lapisan MLP. Sangat mungkin bahwa konfigurasi optimal bervariasi untuk arsitektur dan tugas model yang berbeda.
Beberapa implementasi transformator menggunakan nn.Linear
tunggal untuk matriks proyeksi untuk kueri, kunci, dan nilai. Jika seseorang ingin membatasi peringkat pembaruan ke matriks individu, seseorang harus memecahnya menjadi tiga matriks terpisah atau menggunakan lora.MergedLinear
. Pastikan untuk memodifikasi pos pemeriksaan sesuai jika Anda memilih untuk memecah lapisan.
# ===== 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
. Anda dapat menandai beberapa bias sebagai dapat dilatih dengan melewati "semua" atau "lora_only" ke bias=
saat memanggil mark_only_lora_as_trainable
. Ingatlah untuk meneruskan bias=
argumen ke lora_state_dict
saat menyimpan pos pemeriksaan. # ===== 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()
akan memicu penggabungan parameter LORA dengan yang pretrained yang sesuai, yang menghilangkan latensi tambahan untuk umpan maju berikutnya. Calling model.train()
lagi akan membatalkan gabungan. Ini dapat dinonaktifkan dengan lulus merge_weights=False
ke lapisan Lora. Silakan hubungi kami atau posting masalah jika Anda memiliki pertanyaan.
Untuk pertanyaan yang berkaitan dengan paket loralib
:
Contoh GPT-2:
Contoh Roberta/DeBerta:
Kami berterima kasih dalam urutan abjad Jianfeng Gao, Jade Huang, Jiayuan Huang, Lisa Xiang Li, Xiaodong Liu, Yabin Liu, Benjamin Van Durme, Luis Vargas, Haoran Wei, Peter Waging, dan Greg Yang karena memberikan umpan balik yang berharga.
@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 }
}
Proyek ini menyambut kontribusi dan saran. Sebagian besar kontribusi mengharuskan Anda untuk menyetujui perjanjian lisensi kontributor (CLA) yang menyatakan bahwa Anda memiliki hak untuk, dan benar -benar melakukannya, beri kami hak untuk menggunakan kontribusi Anda. Untuk detailnya, kunjungi https://cla.opensource.microsoft.com.
Saat Anda mengirimkan permintaan tarik, bot CLA akan secara otomatis menentukan apakah Anda perlu memberikan CLA dan menghiasi PR secara tepat (misalnya, pemeriksaan status, komentar). Cukup ikuti instruksi yang disediakan oleh bot. Anda hanya perlu melakukan ini sekali di semua repo menggunakan CLA kami.
Proyek ini telah mengadopsi kode perilaku open source Microsoft. Untuk informasi lebih lanjut, lihat FAQ Kode Perilaku atau hubungi [email protected] dengan pertanyaan atau komentar tambahan.