Ce repo contient le code source du package Python loralib
et plusieurs exemples de la façon de l'intégrer avec des modèles Pytorch, tels que ceux de l'étreinte. Nous ne soutenons que Pytorch pour l'instant. Voir notre article pour une description détaillée de Lora.
LORA: Adaptation de faible rang des modèles de grandes langues
Edward J. Hu *, Yelong Shen *, Phillip Wallis, Zeyuan Allen-Zhu, Yuanzhi Li, Shean Wang, Lu Wang, Weizhu Chen
Papier: https://arxiv.org/abs/2106.09685
Explicateur vidéo: https://www.youtube.com/watch?v=dhrotoncyze
MISE À JOUR 2/2023: LORA est désormais prise en charge par la bibliothèque de fin de paramètre à usine (PEFT) à l'état de la technologie en étreignant la face.
Lora réduit le nombre de paramètres d'entraînement en apprenant des paires de matrices de dépassement de rang tout en gelant les poids d'origine. Cela réduit considérablement l'exigence de stockage pour les modèles de grands langues adaptés à des tâches spécifiques et permet un changement de tâche efficace pendant le déploiement sans introduire la latence d'inférence. LORA surpasse également plusieurs autres méthodes d'adaptation, notamment l'adaptateur, le préfixe et le réglage fin.
Nous obtenons des résultats comparables ou supérieurs à des finetunages complètes sur la référence de colle en utilisant Roberta (Liu et al., 2019) Base et Large et Deberta (He et al., 2020) XXL 1.5B, tout en entraînant et en stockant une fraction des paramètres . Cliquez sur les numéros ci-dessous pour télécharger les points de contrôle Roberta et Deberta Lora.
Base de Roberta Affiner | Base de Roberta Lora | Deberta xxl Affiner | Deberta xxl Lora | ||
---|---|---|---|---|---|
# de paramètres formables. | 125m | 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 (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 | |
Moyenne | 86.40 | 87.24 | 91.06 | 91.32 |
Remarque: Vous avez toujours besoin du point de contrôle pré-formé d'origine de l'étreinte Face pour utiliser les points de contrôle LORA.
Les numéros de réglage fin sont tirés de Liu et al. (2019) et He et al. (2020). Nous incluons des intervalles de confiance sur les résultats de nos expériences. Veuillez suivre les instructions dans examples/NLU/
pour reproduire nos résultats.
Sur GPT-2, LORA se compare favorablement à la fois à des méthodes de réglage complètes et à d'autres méthodes de réglage efficaces, telles que l'adaptateur (Houlsby et al., 2019) et le réglage du préfixe (Li et Liang, 2021). Nous avons évalué sur E2E NLG Challenge, Dart et WebNLG:
Méthode | # de paramètres formables | E2e (bleu) | Fléchette (bleu) | Webnlg (bleu-u / s / a) | |
---|---|---|---|---|---|
GPT-2 M (adulé) | 354,92 m | 68.2 | 46.0 | 30.4 / 63.2 /47.6 | |
GPT-2 M (adaptateur) | 0,37 m | 66.3 | 42.4 | 45.1 / 54.5 / 50.2 | |
GPT-2 M (préfixe) | 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 (aned-tune) | 774.03m | 68.5 | 46.5 | 41.7 / 64.6 /54.2 | |
GPT-2 L (adaptateur) | 0,88 m | 69.1 ± .1 | 45,7 ± .1 | 49,8 ± .0 / 61,1 ± .0 / 56,0 ± .0 | |
GPT-2 L (préfixe) | 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 |
Les lignes de base non Lora, à l'exception de l'adaptateur sur GPT-2 Large, sont tirées de Li et Liang (2021). Nous incluons des intervalles de confiance sur les résultats de nos expériences.
Téléchargez les points de contrôle GPT-2 LORA:
Veuillez suivre les instructions dans examples/NLG/
pour reproduire notre résultat.
(La version initiale de ce dépôt a été archivée dans la branche "Snapshot-9-15-2021")
Il y a plusieurs répertoires dans ce dépôt:
loralib
, qui doit être installé pour exécuter les exemples que nous fournissons;loralib
dans GPT-2, ROBERTA et DEBERTA V2 loralib
est simplement pip install loralib
# Alternatively
# pip install git+https://github.com/microsoft/LoRA
loralib
. Nous ne soutenons que nn.Linear
, nn.Embedding
et nn.Conv2d
pour l'instant. Nous soutenons également une MergedLinear
pour les cas où un seul nn.Linear
représente plus d'une couche, comme dans certaines implémentations de la projection qkv
d'attention (voir des notes supplémentaires pour plus). # ===== 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
qui ne contient que des paramètres LORA. # ===== Before =====
# torch.save(model.state_dict(), checkpoint_path)
# ===== After =====
torch . save ( lora . lora_state_dict ( model ), checkpoint_path )
load_state_dict
, assurez-vous de définir 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 )
Bien que nous nous concentrions sur une configuration d'effet simple mais, à savoir l'adaptation uniquement de la projection q
et v
dans un transformateur, dans nos exemples, LORA peut s'appliquer à tous les sous-ensembles de poids pré-formés. Nous vous encourageons à explorer différentes configurations, telles que l'adaptation de la couche d'intégration en remplaçant nn.Embedding
par lora.Embedding
et / ou en adaptant les couches MLP. Il est très probable que la configuration optimale varie pour différentes architectures et tâches de modèle.
Une certaine implémentation du transformateur utilise un seul nn.Linear
pour les matrices de projection pour la requête, la clé et la valeur. Si l'on souhaite contraindre le rang des mises à jour des matrices individuelles, il faut soit le diviser en trois matrices distinctes ou utiliser lora.MergedLinear
. Assurez-vous de modifier le point de contrôle en conséquence si vous choisissez de briser le calque.
# ===== 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
. Vous pouvez marquer certains biais tels que formables en passant "tous" ou "lora_only" à bias=
lors de l'appel mark_only_lora_as_trainable
. N'oubliez pas de passer l'argument bias=
lora_state_dict
correspondant lors de l'enregistrement d'un point de contrôle. # ===== 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()
déclenchera la fusion des paramètres LORA avec les paramètres de pré-entraînement correspondants, ce qui élimine la latence supplémentaire pour les passes avant ultérieures. L'appel model.train()
annulera à nouveau la fusion. Cela peut être désactivé en passant merge_weights=False
aux couches LORA. Veuillez nous contacter ou publier un problème si vous avez des questions.
Pour des questions liées au package loralib
:
L'exemple GPT-2:
Le Roberta / Deberta Exemple:
Nous remercions dans l'ordre alphabétique Jianfeng Gao, Jade Huang, Jiayuan Huang, Lisa Xiang Li, Xiaodong Liu, Yabin Liu, Benjamin Van Durme, Luis Vargas, Haoran Wei, Peter Wellinder et Greg Yang pour leur rétroaction.
@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 }
}
Ce projet accueille les contributions et les suggestions. La plupart des contributions vous obligent à accepter un accord de licence de contributeur (CLA) déclarant que vous avez le droit de faire et en fait, accordez-nous les droits d'utilisation de votre contribution. Pour plus de détails, visitez https://cla.opensource.microsoft.com.
Lorsque vous soumettez une demande de traction, un bot CLA déterminera automatiquement si vous devez fournir un CLA et décorer le RP de manière appropriée (par exemple, vérification d'état, commentaire). Suivez simplement les instructions fournies par le bot. Vous n'aurez besoin de le faire qu'une seule fois sur tous les dépositions en utilisant notre CLA.
Ce projet a adopté le code de conduite open source Microsoft. Pour plus d'informations, consultez le code de conduite FAQ ou contactez [email protected] avec toute question ou commentaire supplémentaire.