このレポは、Pythonパッケージのloralib
のソースコードと、顔を抱きしめているようなPytorchモデルと統合する方法のいくつかの例が含まれています。今のところPytorchのみをサポートしています。 Loraの詳細な説明については、私たちの論文を参照してください。
LORA:大規模な言語モデルの低ランク適応
エドワード・J・フー*、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(He et al。、2020)xxl 1.5bを使用して、Roberta(Liu et al。、2019)Baseを使用して、接着剤ベンチマークの完全な微調整に匹敵する結果を得ます。 。以下の番号をクリックして、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 | |
コーラ(マシューズコース) | 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(ピアソン/スピアマンコース) | 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は、Adapter(Houlsby et al。、2019)やプレフィックスチューニング(Li and Liang、2021)など、完全な微調整およびその他の効率的なチューニング方法の両方に好意的に比較されます。 E2E NLG Challenge、Dart、およびWebnlgで評価しました。
方法 | #トレーニング可能なパラメーションの# | e2e(bleu) | ダート(ブルー) | webnlg(bleu-u/s/a) | |
---|---|---|---|---|---|
GPT-2M(微調整) | 354.92m | 68.2 | 46.0 | 30.4 / 63.2 /47.6 | |
GPT-2M(アダプター) | 0.37m | 66.3 | 42.4 | 45.1/54.5/50.2 | |
GPT-2M(プレフィックス) | 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(アダプター) | 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(lora) | 0.77m | 70.4 ±.1 | 47.5 ±.1 | 48.4±.3/ 64.0 ±.3/ 57.0 ±.1 |
非Loraベースラインは、GPT-2のアダプターを除き、LiとLiang(2021)から取得されます。実験の結果に信頼区間を含めます。
GPT-2ロラチェックポイントをダウンロードしてください:
結果を再現するには、 examples/NLG/
の指示に従ってください。
(このレポの最初のリリースは、ブランチ「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
を使用します。個々のマトリックスの更新のランクを制約したい場合は、3つの別々のマトリックスに分割するか、 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
で簡単に試してみることができます。 「all」または「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
loraレイヤーに渡すことで無効にすることができます。 ご質問がある場合は、お問い合わせいただくか、問題を投稿してください。
パッケージに関連する質問についてはloralib
:
GPT-2例:
ロベルタ/デバータの例:
Jianfeng Gao、Jade Huang、Jiayuan 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を使用して、すべてのレポでこれを1回だけ行う必要があります。
このプロジェクトは、Microsoftのオープンソース行動規範を採用しています。詳細については、FAQのコードを参照するか、追加の質問やコメントについては[email protected]にお問い合わせください。