Microsoft LoRA プロジェクトの詳細
プロジェクト概要
Microsoft LoRA は、マイクロソフトがオープンソースで公開している Python ライブラリで、"LoRA: Low-Rank Adaptation of Large Language Models"(大規模言語モデルの低ランク適応)技術を実装しています。このプロジェクトは、大規模言語モデルの効率的なファインチューニングに革新的なソリューションを提供します。
プロジェクトアドレス: https://github.com/microsoft/LoRA
論文アドレス: https://arxiv.org/abs/2106.09685
核心技術原理
LoRA 技術概要
LoRA(Low-Rank Adaptation)は、パラメータ効率の高いファインチューニング手法であり、その核心的な考え方は以下の通りです。
- 元の事前学習済み重みを凍結:元のモデルパラメータは変更しません。
- 低ランク分解行列を追加:低ランク行列のペアを学習することでモデルを適応させます。
- 訓練パラメータを大幅に削減:新たに追加された低ランク行列パラメータのみを訓練します。
技術的優位性
- 非常に高いパラメータ効率
- GPT-3 175B のフルファインチューニングと比較して、LoRA は訓練パラメータを 10,000 分の 1 に削減できます。
- GPU メモリの必要量を 3 分の 1 に削減します。
- 優れた性能を維持
- RoBERTa、DeBERTa、GPT-2、GPT-3 でフルファインチューニングと同等またはそれ以上の性能を発揮します。
- GLUE ベンチマークテストで優れた成果を上げています。
- デプロイが容易
- 推論時の遅延は発生しません。
- 効率的なタスク切り替えをサポートします。
- ストレージ要件を大幅に削減します。
性能表現
GLUE ベンチマークテスト結果
GLUE ベンチマークテストにおいて、LoRA は優れた性能を発揮しました。
| モデル | 訓練パラメータ数 | MNLI 精度 | SST-2 精度 | MRPC 精度 |
|---|---|---|---|---|
| RoBERTa Base フルファインチューニング | 125M | 87.6 | 94.8 | 90.2 |
| RoBERTa Base LoRA | 0.8M | 87.6±.1 | 95.1±.2 | 89.7±.7 |
| DeBERTa XXL フルファインチューニング | 1.5B | 91.1 | 96.8 | 92.9 |
| DeBERTa XXL LoRA | 4.7M | 91.9±.1 | 96.9±.2 | 92.6±.6 |
GPT-2 テキスト生成タスク
E2E、DART、WebNLG などのテキスト生成タスクにおいても、LoRA は同様に優れた性能を発揮します。
| 方法 | 訓練パラメータ | E2E (BLEU) | DART (BLEU) | WebNLG (BLEU) |
|---|---|---|---|---|
| GPT-2 M フルファインチューニング | 354.92M | 68.2 | 46.0 | 47.6 |
| GPT-2 M LoRA | 0.35M | 70.4±.1 | 47.1±.2 | 55.3±.2 |
プロジェクト構造
microsoft/LoRA/
├── loralib/ # コアライブラリのソースコード
├── examples/
│ ├── NLG/ # GPT-2 自然言語生成の例
│ └── NLU/ # RoBERTa/DeBERTa 自然言語理解の例
├── README.md
└── setup.py
インストールと使用方法
インストール方法
pip install loralib
# またはソースコードからインストール
pip install git+https://github.com/microsoft/LoRA
基本的な使用例
1. 線形層の置換
# ===== 変更前 =====
# layer = nn.Linear(in_features, out_features)
# ===== 変更後 =====
import loralib as lora
layer = lora.Linear(in_features, out_features, r=16)
2. 訓練可能なパラメータのマーク
import loralib as lora
model = BigModel()
# "lora_" を含むパラメータのみを訓練可能に設定
lora.mark_only_lora_as_trainable(model)
# 訓練ループ
for batch in dataloader:
# 通常の訓練フロー
pass
3. チェックポイントの保存とロード
# LoRA パラメータの保存
torch.save(lora.lora_state_dict(model), 'lora_checkpoint.pt')
# 事前学習済みモデルのロード
model.load_state_dict(torch.load('pretrained.pt'), strict=False)
# LoRA パラメータのロード
model.load_state_dict(torch.load('lora_checkpoint.pt'), strict=False)
サポートされている層タイプ
現在、LoRA ライブラリは以下の層タイプをサポートしています。
nn.Linear→lora.Linearnn.Embedding→lora.Embeddingnn.Conv2d→lora.Conv2dlora.MergedLinear(QKV 投影などの結合線形層用)
高度な機能
1. 結合線形層のサポート
# QKV 投影などのシナリオ向け
qkv_proj = lora.MergedLinear(
d_model, 3*d_model,
r=8,
enable_lora=[True, False, True] # Q と V にのみ LoRA を適用
)
2. バイアスベクトルの訓練
# LoRA 関連のバイアスを訓練
lora.mark_only_lora_as_trainable(model, bias='lora_only')
# すべてのバイアスを訓練
lora.mark_only_lora_as_trainable(model, bias='all')
3. 推論時の重みマージ
# 評価モード:重みをマージし、推論遅延を解消
model.eval()
# 訓練モード:分離状態に戻す
model.train()
応用シーン
- 大規模モデルのファインチューニング:ファインチューニングコストを大幅に削減
- マルチタスク学習:効率的なタスク切り替え
- リソース制約のある環境:メモリとストレージの必要量を削減
- 迅速なプロトタイプ開発:モデル適応プロセスを加速
エコシステム統合
- Hugging Face PEFT:HF の PEFT ライブラリに統合済み
- PyTorch エコシステム:PyTorch フレームワークと完全に互換性があります。
- 事前学習済みモデル:さまざまな主要な事前学習済みモデルをサポートします。
まとめ
Microsoft LoRA プロジェクトは、大規模言語モデルの効率的なファインチューニングに画期的なソリューションを提供します。巧妙な低ランク適応技術により、計算コストとストレージコストを大幅に削減しながら、優れたモデル性能を維持します。このプロジェクトは、重要な学術的価値を持つだけでなく、実際の産業応用にも実行可能な技術的経路を提供し、パラメータ効率の高いファインチューニング分野における画期的な成果です。