이 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는 또한 어댑터, 접두사 튜닝 및 미세 조정을 포함한 몇 가지 다른 적응 방법을 능가합니다.
우리는 Roberta (Liu et al., 2019) Base and Large and Deberta (He et al., 2020) XXL 1.5B를 사용하여 접착제 벤치 마크에서 완전한 결합보다 비슷하거나 우수한 결과를 얻습니다. . 아래 번호를 클릭하여 Roberta와 Deberta Lora 체크 포인트를 다운로드하십시오.
로베르타베이스 미세 조정 | 로베르타베이스 로라 | 디버타 XXL 미세 조정 | 디버타 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 et al. (2019) 및 He et al. (2020). 실험 결과에 대한 신뢰 구간이 포함되어 있습니다. examples/NLU/
의 지침을 따르면 결과를 재현하십시오.
GPT-2에서 LORA는 어댑터 (Houlsby et al., 2019) 및 접두사 튜닝 (Li and Liang, 2021)과 같은 전체 결합 및 기타 효율적인 튜닝 방법과 호의적으로 비교됩니다. 우리는 E2E NLG Challenge, Dart 및 WebNLG에 대해 평가했습니다.
방법 | 훈련 가능한 매개 변수의 # | E2E (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 (로라) | 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 (로라) | 0.77m | 70.4 ± .1 | 47.5 ± .1 | 48.4 ± .3/ 64.0 ± .3/ 57.0 ± .1 |
GPT-2 큰 어댑터를 제외한 비 로라 기준은 Li and Liang (2021)에서 가져온다. 실험 결과에 대한 신뢰 구간이 포함되어 있습니다.
GPT-2 LORA 체크 포인트를 다운로드하십시오.
우리의 결과를 재현하려면 examples/NLG/
의 지침을 따르십시오.
(이 repo의 초기 릴리스는 "Snapshot-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
만 지원합니다. 또한 단일 nn.Linear
가주의 qkv
프로젝션의 일부 구현과 같이 하나 이상의 레이어를 나타내는 경우 MergedLinear
지원합니다 (자세한 내용은 추가 메모 참조). # ===== 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
프로젝션 만 조정하는 데 중점을 두지 만, 예에서 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
에서 쉽게 시도 할 수 있습니다. mark_only_lora_as_trainable
호출 할 때 "모두"또는 "lora_only"를 bias=
에 전달하여 약간의 편견을 훈련 가능한 것으로 표시 할 수 있습니다. 체크 포인트를 저장할 때 해당 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
lora 층으로 전달하여 비활성화 할 수 있습니다. 궁금한 점이 있으면 당사에 문의하거나 문제를 게시하십시오.
패키지 loralib
과 관련된 질문 :
GPT-2 예 :
Roberta/Deberta 예 :
우리는 알파벳 순서로 Jianfeng Gao, Jade Huang, Jiyuan 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을 적절하게 장식 해야하는지 자동으로 결정합니다 (예 : 상태 점검, 댓글). 봇이 제공 한 지침을 따르십시오. CLA를 사용하여 모든 저장소에서 한 번만이 작업을 수행하면됩니다.
이 프로젝트는 Microsoft 오픈 소스 행동 강령을 채택했습니다. 자세한 내용은 추가 질문이나 의견이 있으면 행동 강령 FAQ 또는 [email protected]에 문의하십시오.