이 코드베이스는 LORA : 대형 언어 모델의 낮은 순위 적응 (ICLR 2022)을 상환하며 Loralib에 기초하여 재구성됩니다.
loratorch 와 loralib 의 구현은 매우 다릅니다. 우리는 다음과 같이 nn.Linear 를 예로 봅니다.
loralib 의 경우 어디
loratorch 의 경우 loralib 계산합니다 loratorch 미리 훈련 된 중량을 합쳐집니다 nn.Linear.forward() 사용하여 결과를 계산합니다. 선형 층에는 loralib 과 loratorch 사이에는 차이가 없습니다. 그러나 일부 비선형 또는 복잡한 층에서는이 층이 만족하는지 확실하지 않습니다. loralib 사용하여 LORA를 일부 복잡한 층으로 확장하는 것은 어렵습니다. 반대로, loratorch 에서 먼저 가중치를 병합한다는 아이디어는 더 일반적이며 확장 가능합니다. loratorch 의 merge_lora_param() 호출하여 가중치를 병합 한 다음 원래 레이어로 forward() 호출하여 결과를 계산합니다. loratorch 의 도움으로 모든 유형의 torch.nn 에 LORA를 쉽게 구현할 수 있습니다.
loralib | loratorch | ||
|---|---|---|---|
nn.Linear | ✓ | ✓ | linear.ipynb |
nn.Embedding | ✓ | ✓ | embedding.ipynb |
nn.Conv1d | ✓ | ✓ | |
nn.Conv2d | ✓ | ✓ | |
nn.Conv3d | ✓ | ✓ | |
nn.MultiheadAttention | ✘ | ✓ | |
MergedLinear | ✓ (오류) | ✓ | mergedlinear.ipynb |
| 확장하기 어렵습니다 | 확장하기 쉽습니다 |
loratorch 에서의 구현의 정확성을 보여주기 위해 예제에서 loralib 및 loratorch 의 결과를 비교합니다.
loratorch 의 사용은 loralib 과 동일합니다.
loratorch 설치하십시오.
pip install git+https://github.com/Baijiong-Lin/LoRA-Torch
# Alternatively for developers
# git clone https://github.com/Baijiong-Lin/LoRA-Torch
# cd LoRA-Torch
# pip install -e . loratorch 사용하여 Lora를 사용하려는 레이어를 교체하십시오.
# ===== Before =====
# layer = nn.Linear(in_features, out_features)
# ===== After ======
import loratorch as lora
# Add a pair of low-rank adaptation matrices with rank r=16 and alpha=32
layer = lora . Linear ( in_features , out_features , r = 16 , lora_alpha = 32 )훈련 루프 전에 LORA 매개 변수 만 훈련 가능한 것으로 표시하십시오.
model = Model ()
# (!!!) This sets requires_grad to False for all parameters without the string "lora_" in their names
lora . mark_only_lora_as_trainable ( model )
optimizer = torch . optim . SGD ( model . parameters (), lr = 0.1 )
# Training loop
for batch in dataloader :
model . train ()
# forward process
loss = forward_fun ( model , batch )
# backward process
optimizer . zero_grad ()
loss . backward ()
optimizer . step ()
# (!!!) reregister model param to ensure they are in model.state_dict() and model.parameters()
# (!!!) Without this line, the performance does not be affected but you will find that some weights are missing in model.state_dict() and model.parameters()
lora . register_model_param_after_backward ( model )LORA 모델을 저장하십시오 (LORA 매트릭스 만 저장).
# ===== Before =====
# torch.save(model.state_dict(), checkpoint_path)
# ===== After =====
torch . save ( lora . lora_state_dict ( model ), checkpoint_path )LORA 모델을로드하십시오 (사전 훈련 된 모델을 먼저로드해야 함).
# Load the pre-trained 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 ) loratorch Baijiong Lin에 의해 개발되고 유지됩니다.
질문이나 제안이 있으시면 문제를 제기하거나 [email protected] 으로 이메일을 보내 주시기 바랍니다.
loratorch loralib 기반으로합니다. 우리는 훌륭하고 오픈 소스 코드베이스에 대해 저자에게 감사합니다.
loratorch 연구 또는 개발에 유용한 것을 발견하면 다음을 인용하십시오.
@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 } ,
}
@software { lin2023loratorch ,
author = { Baijiong Lin } ,
title = { {LoRA-Torch}: {PyTorch} Reimplementation of {LoRA} } ,
url = { https://github.com/Baijiong-Lin/LoRA-Torch } ,
year = { 2023 }
} loratorch MIT 라이센스에 따라 릴리스됩니다.