此存储库包含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)库支持,通过拥抱面孔。
洛拉通过学习秩定矩阵的一对,同时冻结原始权重,从而减少了可训练的参数的数量。这大大减少了适合特定任务的大型语言模型的存储要求,并在部署过程中启用了有效的任务转换,而无需引入推理潜伏期。洛拉还胜过其他几种适应方法,包括适配器,前缀调整和微调。
我们获得了使用Roberta(Liu等人,2019年)基础和大型和Deberta(He等,2020)XXL 1.5B的胶水基准上的全面填充的结果可比性或优越。 。单击下面的数字下载Roberta和Deberta Lora检查点。
罗伯塔基地 微调 | 罗伯塔基地 洛拉 | Deberta XXL 微调 | Deberta XXL 洛拉 | ||
---|---|---|---|---|---|
可训练的参数#。 | 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 | |
可乐(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与完整的燃烧和其他有效的调整方法相比,例如适配器(Houlsby et al。,2019)和前缀调整(Li and Liang,2021)。我们评估了E2E NLG挑战,DART和WebNLG:
方法 | 可训练的参数# | e2e(bleu) | 飞镖(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(适配器) | 88m | 69.1±.1 | 45.7±.1 | 49.8 ±.0/61.1±.0/56.0±.0 | |
GPT-2 L(前缀) | 1.77m | 70.3 | 46.5 | 47.0/64.2/56.4 | |
GPT-2 L(Lora) | 1.77m | 70.4 ±.1 | 47.5 ±.1 | 48.4±.3/ 64.0 ±.3/ 57.0 ±.1 |
除GPT-2较大的适配器外,非洛拉基线取自Li和Liang(2021)。我们包括实验结果的置信区间。
下载GPT-2 LORA检查点:
请按照examples/NLG/
中的说明来重现我们的结果。
(此存储库的初始版本已存档在“快照-9-15-2021”的分支机构中)
此存储库中有几个目录:
loralib
的源代码,需要安装该软件包以运行我们提供的示例;loralib
loralib
简直就是pip install loralib
# Alternatively
# pip install git+https://github.com/microsoft/LoRA
loralib
中实现的对应物替换一些层来适应一些层。我们现在仅支持nn.Linear
, nn.Embedding
和nn.Conv2d
。我们还支持单个MergedLinear
代表多个层的情况,例如在注意qkv
投影的某些实现中(有关更多内容nn.Linear
请参见其他注释)。 # ===== 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
。 # ===== 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
投影,但在我们的示例中,洛拉可以应用于任何预训练的权重的子集。我们鼓励您探索不同的配置,例如通过用nn.Embedding
和/或适应MLP层来调整嵌入层lora.Embedding
最佳配置在不同的模型体系结构和任务中很可能会有所不同。
一些变压器实现使用单个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参数与相应的预验证参数的合并,从而消除了后续正向通行证的额外延迟。再次呼叫model.train()
将撤消合并。可以通过将merge_weights=False
to Lora层来禁用这一点。 如果您有任何疑问,请联系我们或发布问题。
对于与包裹loralib
有关的问题:
GPT-2示例:
罗伯塔/迪伯塔省的例子:
我们感谢按字母顺序的命令Jianfeng Gao,Jade Huang,Jiayuan Huang,Lisa Xiang Li,Xiaodong Liu,Yabin Liu,Benjamin van Durme,Luis Vargas,Haoran Wei,Haoran Wei,Peter Welinder和Greg Yang和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(例如状态检查,评论)。只需按照机器人提供的说明即可。您只需要使用我们的CLA在所有存储库中进行一次。
该项目采用了Microsoft开源的行为代码。有关更多信息,请参见《行为守则常见问题守则》或与其他问题或评论联系[email protected]。