Loldu是一種尖端參數有效的微調(PEFT)技術,旨在大幅度減少可訓練參數的數量,同時達到與完整微調相當的性能水平。本文檔概述了有效地將Loldu集成到您的項目中所需的步驟。
有關更多詳細信息,請參閱論文:https://arxiv.org/pdf/2410.13618
要安裝Loldu,只需使用PIP:
git clone https://github.com/SKDDJ/LoLDU
cd LoLDU
pip install -e . 這是如何使用loldu的快速示例:
import torch
import torch . nn as nn
from functools import partial
from minloldu import LoLDUParametrization , add_loldu , get_loldu_params
# Define your model
model = YourModel ()
# Define LoLDU configuration
loldu_config = {
nn . Linear : {
"weight" : partial ( LoLDUParametrization . from_linear , rank = 15 ),
},
}
# Add LoLDU to the model
add_loldu ( model , loldu_config = loldu_config )
# Freeze all parameters
for param in model . parameters ():
param . requires_grad = False
# Enable gradients for LoLDU parameters
for param in get_loldu_params ( model ):
param . requires_grad = True
# Now your model is ready for fine-tuning with LoLDU add_loldu(model, loldu_config)
model :要修改的Pytorch模型。loldu_config :loldu的配置字典。 get_loldu_params(model, print_shapes=False)
model :帶有Loldu的Pytorch模型。print_shapes :如果為true,則打印loldu參數的形狀。 disable_loldu(model)
enable_loldu(model)
remove_loldu(model)
merge_loldu(model)
get_loldu_state_dict(model)
LoLDUParametrization.from_linear(layer, rank)layer :要參數化的線性層。rank :低級別近似的等級。 from minloldu import LoLDUParametrization , add_loldu
from functools import partial
class MyModel ( nn . Module ):
def __init__ ( self ):
super (). __init__ ()
self . model = nn . Sequential (
nn . Linear ( in_features = 15 , out_features = 15 ),
)
def forward ( self , x ):
return self . model ( x )
model = MyModel ()
loldu_config = {
nn . Linear : {
"weight" : partial ( LoLDUParametrization . from_linear , rank = 15 ),
},
}
add_loldu ( model , loldu_config = loldu_config ) from minloldu import get_loldu_params
# Freeze all parameters
for param in model . parameters ():
param . requires_grad = False
# Enable gradients for LoLDU parameters
for param in get_loldu_params ( model ):
param . requires_grad = True
# Your training loop here from minloldu import get_loldu_state_dict
# Save LoLDU state
state_dict_to_save = get_loldu_state_dict ( model )
torch . save ( state_dict_to_save , "loldu_state.pth" )
# Load LoLDU state
loaded_state = torch . load ( "loldu_state.pth" )
model . load_state_dict ( loaded_state , strict = False ) from minloldu import merge_loldu
# After training, merge LoLDU for efficient inference
merge_loldu ( model )選擇適當的等級:Lolduparametrization中的等級參數會影響參數效率和模型性能之間的權衡。試驗不同的等級以找到任務的最佳平衡。
微調超參數:與完整的微調相比,Loldu可能需要不同的學習率。相應地調整您的學習率和其他超參數。
監視訓練:請密切關注訓練過程,以確保Loldu有效地適應模型。使用驗證集防止過度擬合。
合併推理:在部署模型以取消任何計算開銷之前,請務必使用merge_loldu() 。
與其他技術結合使用:Loldu可以與其他優化技術(例如量化)結合使用,以提高效率。
有關更多詳細信息和高級用法,請參閱原始紙張和源代碼存儲庫。
筆記:
請注意,該代碼可能不會完全複製論文中呈現的結果,這是因為在發布之前可能發生和清潔代碼期間發生的人類錯誤。如果您在復制我們的發現方面面臨任何挑戰,請隨時與我們聯繫。此外,我們致力於在不久的將來進行理智檢查實驗。
致謝
Minlora代碼庫大大提高了我們的Loldu實施。
Bibtex
@misc { shi2024loldulowrankadaptationlowerdiagupper ,
title = { LoLDU: Low-Rank Adaptation via Lower-Diag-Upper Decomposition for Parameter-Efficient Fine-Tuning } ,
author = { Yiming Shi and Jiwei Wei and Yujia Wu and Ran Ran and Chengwei Sun and Shiyuan He and Yang Yang } ,
year = { 2024 } ,
eprint = { 2410.13618 } ,
archivePrefix = { arXiv } ,
primaryClass = { cs.CV } ,
url = { https://arxiv.org/abs/2410.13618 } ,
}