Dieses Repo enthält den Quellcode des Python -Pakets loralib
und mehrere Beispiele für die Integration in Pytorch -Modelle, wie z. B. die im Umarmungsgesicht. Wir unterstützen Pytorch nur vorerst. In unserem Artikel finden Sie eine detaillierte Beschreibung von Lora.
LORA: Niedrige Anpassung von Großsprachmodellen
Edward J. Hu*, Yelong Shen*, Phillip Wallis, Zeyuan Allen-Zhu, Yuanzhi Li, Shean Wang, Lu Wang, Weishu Chen
Papier: https://arxiv.org/abs/2106.09685
Video Erklärung: https://www.youtube.com/watch?v=dhrotoncyze
UPDATE 2/2023: LORA wird nun durch die PEFT-Bibliothek (Parameter-effizientes Fine-Tuning) durch Umarmung unterstützt.
LORA reduziert die Anzahl der trainierbaren Parameter, indem sie Paare von Rangabbau-Matrizen lernen und gleichzeitig die ursprünglichen Gewichte einfrieren. Dies reduziert die Speicheranforderung für große Sprachmodelle, die an bestimmte Aufgaben angepasst sind, erheblich und ermöglicht eine effiziente Aufgabe, die während der Bereitstellung zu senken, ohne Inferenzlatenz einzuführen. LORA übertrifft auch mehrere andere Anpassungsmethoden, darunter Adapter, Präfixabstimmung und Feinabstimmung.
Wir erhalten das Ergebnis vergleichbar oder überlegen gegenüber der vollen Finetuning auf dem Klebstoff -Benchmark unter Verwendung von Roberta (Liu et al., 2019) Basis und Large und Deberta (He et al., 2020) xxl 1,5b, während nur ein Bruchteil der Parameter trainiert und gespeichert wird . Klicken Sie auf die unten stehenden Zahlen, um die Checkpoints Roberta und DeBerta Lora herunterzuladen.
Roberta Basis Feinabstimmung | Roberta Basis Lora | Deberta xxl Feinabstimmung | Deberta xxl Lora | ||
---|---|---|---|---|---|
Anzahl der trainierbaren Parameter. | 125 m | 0,8 m | 1,5b | 4,7 m | |
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 (Matthews 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 | |
Durchschnitt | 86.40 | 87,24 | 91.06 | 91.32 |
Hinweis: Sie benötigen immer noch den ursprünglichen vorgebildeten Checkpoint von der Umarmung, um die LORA-Checkpoints zu verwenden.
Feinabstimmungszahlen stammen von Liu et al. (2019) und He et al. (2020). Wir enthalten Konfidenzintervalle zu Ergebnissen aus unseren Experimenten. Bitte befolgen Sie die Anweisungen in examples/NLU/
um unsere Ergebnisse zu reproduzieren.
Auf GPT-2 vergleicht LORA sowohl mit vollständigen Finetuning als auch mit anderen effizienten Abstimmmethoden wie Adapter (Houlsby et al., 2019) und Präfixabstimmung (Li und Liang, 2021). Wir haben auf E2E NLG Challenge, Dart und WebNLG bewertet:
Verfahren | Anzahl der trainierbaren Parameter | E2E (Bleu) | Dart (Bleu) | WebNLG (Bleu-U/S/A) | |
---|---|---|---|---|---|
GPT-2 M (Feinabstimmung) | 354,92 m | 68,2 | 46.0 | 30.4 / 63.2 / 47.6 | |
GPT-2 M (Adapter) | 0,37 m | 66,3 | 42.4 | 45.1/54.5/50.2 | |
GPT-2 M (Präfix) | 0,35 m | 69.7 | 45,7 | 44.1/63.1/54.4 | |
GPT-2 M (Lora) | 0,35 m | 70,4 ± .1 | 47,1 ± .2 | 46,7 ± .4/ 62,1 ± .2/ 55,3 ± .2 | |
GPT-2 L (Feinabstimmung) | 774,03 m | 68,5 | 46,5 | 41.7 / 64.6 /54.2 | |
GPT-2 L (Adapter) | 0,88 m | 69,1 ± .1 | 45,7 ± .1 | 49,8 ± 0,0/61,1 ± 0,0/56,0 ± 0,0 | |
GPT-2 L (Präfix) | 0,77 m | 70.3 | 46,5 | 47.0/64.2/56.4 | |
GPT-2 L (Lora) | 0,77 m | 70,4 ± .1 | 47,5 ± .1 | 48,4 ± .3/ 64,0 ± .3/ 57,0 ± .1 |
Nicht-LORA-Basislinien, mit Ausnahme von Adapter auf GPT-2 groß, stammen von Li und Liang (2021). Wir enthalten Konfidenzintervalle zu Ergebnissen aus unseren Experimenten.
Laden Sie die GPT-2 LORA-Kontrollpunkte herunter:
Bitte befolgen Sie die Anweisungen in examples/NLG/
um unser Ergebnis zu reproduzieren.
(Die erste Veröffentlichung dieses Repos wurde in der Filiale "Snapshot-9-15-2021" archiviert)
In diesem Repo gibt es mehrere Verzeichnisse:
loralib
, das installiert werden muss, um die von uns bereitgestellten Beispiele auszuführen.loralib
in GPT-2, Roberta und DeBerta V2 verwenden loralib
zu installieren ist einfach pip install loralib
# Alternatively
# pip install git+https://github.com/microsoft/LoRA
loralib
implementierte Gegenstücke ersetzen. Wir unterstützen für den Moment nur nn.Linear
, nn.Embedding
und nn.Conv2d
. Wir unterstützen auch einen MergedLinear
qkv
Fälle, in denen ein einzelner nn.Linear
mehr als ein Schicht darstellt, z. # ===== 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
, das nur LORA -Parameter enthält. # ===== Before =====
# torch.save(model.state_dict(), checkpoint_path)
# ===== After =====
torch . save ( lora . lora_state_dict ( model ), checkpoint_path )
load_state_dict
unbedingt strict=False
fest. # 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 )
Während wir uns auf ein einfaches, dennoch Effekt-Setup konzentrieren, nämlich nur die q
und v
-Projektion in einem Transformator anpasst, kann Lora in unseren Beispielen für alle Teilmengen vorgebliebener Gewichte angewendet werden. Wir lora.Embedding
Ihnen, verschiedene nn.Embedding
zu untersuchen, z. Es ist sehr wahrscheinlich, dass die optimale Konfiguration für verschiedene Modellarchitekturen und -aufgaben variiert.
Einige Transformatoren -Implementierung verwendet einen einzelnen nn.Linear
für die Projektionsmatrizen für Abfrage, Schlüssel und Wert. Wenn man den Rang der Aktualisierungen auf die einzelnen Matrizen einschränken möchte, muss man ihn entweder in drei separate Matrizen zerlegen oder lora.MergedLinear
verwenden. Stellen Sie sicher, dass der Kontrollpunkt entsprechend geändert wird, wenn Sie die Ebene aufbrechen.
# ===== 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
zu versuchen. Sie können einige Vorurteile markieren, die als trainierbar sind, indem Sie "alle" oder "lora_only" an bias=
übergeben, wenn Sie mark_only_lora_as_trainable
aufrufen. Denken Sie daran, das entsprechende bias=
Argument an lora_state_dict
beim Speichern eines Checkpoint zu übergeben. # ===== 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()
löst die Verschmelzung von LORA -Parametern mit den entsprechenden vorbereiteten, die zusätzliche Latenz für nachfolgende Vorwärtskarten beseitigt. model.train()
wird die Zusammenführung erneut rückgängig machen. Dies kann deaktiviert werden, indem merge_weights=False
an Lora -Ebenen bestanden wird. Bitte kontaktieren Sie uns oder veröffentlichen Sie ein Problem, wenn Sie Fragen haben.
Für Fragen im Zusammenhang mit dem Paket loralib
:
Das GPT-2-Beispiel:
Das Beispiel von Roberta/DeBerta:
Wir danken in alphabetischer Reihenfolge Jianfeng Gao, Jade Huang, Jiyuan Huang, Lisa Xiang Li, Xiaodong Liu, Yabin Liu, Benjamin van Durme, Luis Vargas, Haoran Wei, Peter Welinder und Greg Yang, um wertvolles Feedback zu geben.
@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 }
}
Dieses Projekt begrüßt Beiträge und Vorschläge. In den meisten Beiträgen müssen Sie einer Mitarbeiters Lizenzvereinbarung (CLA) zustimmen, in der Sie erklären, dass Sie das Recht haben und uns tatsächlich tun, um uns die Rechte zu gewähren, Ihren Beitrag zu verwenden. Weitere Informationen finden Sie unter https://cla.opensource.microsoft.com.
Wenn Sie eine Pull -Anfrage einreichen, bestimmt ein CLA -Bot automatisch, ob Sie eine CLA angeben und die PR angemessen dekorieren müssen (z. B. Statusprüfung, Kommentar). Befolgen Sie einfach die vom Bot bereitgestellten Anweisungen. Sie müssen dies nur einmal über alle Repos mit unserem CLA tun.
Dieses Projekt hat den Microsoft Open Source -Verhaltenscode übernommen. Weitere Informationen finden Sie im FAQ oder wenden Sie sich an [email protected] mit zusätzlichen Fragen oder Kommentaren.