Skip to content
Published on

LoRA: 大規模言語モデルの効率的ファインチューニング論文分析

Authors
  • Name
    Twitter

1. はじめに

GPT-3(175B)、LLaMA(65B)、Falcon(180B)などの大規模言語モデル(LLM)は、様々なNLPタスクで驚異的な性能を示している。しかし、これらのモデルを特定のドメインやタスクに適応させるファインチューニングの過程は、依然として膨大な計算リソースを必要とする。2021年にMicrosoft Researchが発表した**LoRA(Low-Rank Adaptation of Large Language Models)**論文は、この問題に対する優雅な解法を提示し、現在LLMファインチューニングのデファクトスタンダードとなっている。

本稿では、LoRA論文(Hu et al., 2021)の核心原理を数学的に分析し、後続研究であるQLoRA、そしてHuggingFace PEFTライブラリを活用した実践的な適用方法まで体系的にまとめる。


2. Full Fine-tuningの問題点

2.1 パラメータ数とGPUメモリ

Full Fine-tuningは、事前学習済みモデルのすべてのパラメータを更新する。GPT-3 175Bモデルを基準に見ると、そのコストは明白である。

項目Full Fine-tuningLoRA (r=4)
学習可能パラメータ数175B (100%)4.7M (~0.003%)
GPU VRAM要件~1.2TB~350GB
チェックポイントサイズ~350GB~35MB

Full Fine-tuningでAdamオプティマイザを使用する場合、各パラメータに対してmomentumとvarianceの2つの状態値を追加で保存する必要がある。したがって、16-bit精度でもモデル重み(2バイト)+ 勾配(2バイト)+ オプティマイザ状態(8バイト)= パラメータあたり約12バイトが必要となる。175Bモデルの場合、約2.1TBのメモリが必要になる計算だ。

2.2 ストレージとデプロイコスト

Full Fine-tuningを行うと、タスクごとにモデル全体のコピーを保存する必要がある。10の異なるタスクにGPT-3をFine-tuningするなら、350GB x 10 = 3.5TBのストレージが必要になる。一方、LoRAはタスクごとに約35MBのadapter重みを保存するだけでよいため、同じシナリオで350MBで十分である。これは約10,000倍のストレージ削減に相当する。

2.3 推論レイテンシの問題

従来のAdapter基盤の手法(Houlsby et al., 2019)は、モデル構造に追加のレイヤーを挿入するため、推論時のレイテンシが増加する問題があった。特にバッチサイズが小さいオンラインサービング環境では、このオーバーヘッドが無視できないレベルになる。LoRAはこの問題を根本的に解決する。


3. LoRAの核心アイデア:重み変化量のLow-Rank分解

3.1 核心仮説

LoRAの核心仮説は以下の通りである:

事前学習済みモデルの重みを特定のタスクに適応させる際、重みの変化量(delta W)は低い内在的次元(low intrinsic rank)を持つ。

この仮説はAghajanyan et al.(2020)の研究に着想を得たもので、事前学習済みモデルがすでに十分良い表現を学習しているため、タスク適応に必要な変化量はパラメータ空間全体のごく一部に集中するという直観に基づいている。

3.2 数学的定式化

事前学習済み重み行列を W0Rd×kW_0 \in \mathbb{R}^{d \times k} とする。Full Fine-tuningでは W0+ΔWW_0 + \Delta W に更新され、ΔWRd×k\Delta W \in \mathbb{R}^{d \times k} はパラメータ空間全体と同じ次元を持つ。

LoRAはこの ΔW\Delta W2つの低ランク行列の積に分解する:

ΔW=BA\Delta W = BA

ここで:

  • BRd×rB \in \mathbb{R}^{d \times r}(down-projection)
  • ARr×kA \in \mathbb{R}^{r \times k}(up-projection)
  • rmin(d,k)r \ll \min(d, k)(rank、通常1〜64)

したがって、Forward passは以下のように変更される:

h=W0x+ΔWx=W0x+BAxh = W_0 x + \Delta W x = W_0 x + BAx

学習可能なパラメータ数は d×kd \times k から r×(d+k)r \times (d + k) へ大幅に削減される。例えば、d=k=12288d = k = 12288(GPT-3のhidden dimension)で r=8r = 8 の場合:

  • Full Fine-tuning: 12288×12288=150,994,94412288 \times 12288 = 150,994,944 パラメータ
  • LoRA: 8×(12288+12288)=196,6088 \times (12288 + 12288) = 196,608 パラメータ(約768倍の削減

3.3 初期化戦略

LoRAの初期化は、学習開始時点で ΔW=0\Delta W = 0 となるよう設計されている:

  • 行列A:Random Gaussian初期化
  • 行列Bゼロ初期化

これにより学習開始時に BA=0BA = 0 となるため、LoRA adapterが追加されても元の事前学習済みモデルと同一の出力を生成する。これは学習の安定性を保証する重要な設計上の決定である。

3.4 スケーリングファクター:alpha/r

実際のForward passでは、LoRAの出力にスケーリングファクター αr\frac{\alpha}{r} が乗じられる:

h=W0x+αrBAxh = W_0 x + \frac{\alpha}{r} BAx

ここで α\alpha は定数(ハイパーパラメータ)である。原論文では、α\alpha を最初に試した rr の値に設定し、その後変更しなかったと述べている。このスケーリングファクターの役割は、rank rr を変更する際にlearning rateを再調整する必要性を軽減することである。

最近では**Rank-Stabilized LoRA(rsLoRA)**が提案され、スケーリングファクターを αr\frac{\alpha}{\sqrt{r}} に設定することで、高いrankでの学習安定性が改善された。HuggingFace PEFTでは use_rslora=True オプションでこれを有効化できる。

3.5 推論時のマージ(Merge)

LoRAの最大の利点の一つは、推論時に追加のレイテンシがないことである。学習が完了すれば、adapter重みを元のモデルにマージできる:

W=W0+αrBAW = W_0 + \frac{\alpha}{r} BA

マージ後は元のモデルと同一の構造であるため、推論速度は全く低下しない。一方、別のタスクのadapterに切り替えたい場合は、BABA を引いて別の BAB'A' を加えればよい。この柔軟性により、一つのbase modelに複数のタスク別adapterを効率的に管理できる。


4. 数学的背景:Intrinsic Dimensionality

4.1 Intrinsic Dimensionalityとは?

Aghajanyan et al.(2020)は、論文**"Intrinsic Dimensionality Explains the Effectiveness of Language Model Fine-Tuning"**で、事前学習済み言語モデルのFine-tuning過程が驚くほど低い内在的次元(intrinsic dimension)を持つことを実験的に示した。

核心的なアイデアは以下の通りである。全パラメータ空間 RD\mathbb{R}^D(Dは全パラメータ数)での最適化問題を、はるかに小さい部分空間 Rd\mathbb{R}^ddDd \ll D)での最適化問題に再パラメータ化(reparameterize)しても、Full Fine-tuningと同等の性能を達成できるということだ。

4.2 LoRAとの関連

LoRAはこの観察を直接的に活用している。重み更新 ΔW\Delta W が低いintrinsic rankを持つなら、これを低ランク行列積 BABA で近似することは合理的である。

実際、LoRA論文の実験結果はこの仮説を強く裏付けている。GPT-3 175Bモデルで WqW_qWvW_v にLoRAを適用した場合、rank r=1だけでも十分に競争力のある性能を達成した:

Rank (r)WikiSQL Acc.MultiNLI Acc.
173.4%91.3%
273.3%91.4%
473.7%91.3%
873.8%91.6%
6473.5%91.4%

r=1r=1r=64r=64 の性能差がほとんどないことは、重み変化量のintrinsic rankが非常に低いという仮説を実験的に証明している。これは「より大きなrankが常に良いとは限らない」という実用的な示唆を与えている。


5. Rank選択戦略と適用レイヤー

5.1 どのレイヤーにLoRAを適用すべきか?

TransformerのSelf-Attentionブロックには4つの重み行列がある:WqW_q(Query)、WkW_k(Key)、WvW_v(Value)、WoW_o(Output projection)。LoRA論文では、GPT-3 175Bモデルに同一のパラメータバジェット(18M)の下で様々な組み合わせを実験した。

結果として、WqW_qWvW_vを同時に適用するのが最適な性能を示した。単一の行列にのみ適用すると(例:WqW_q のみや WvW_v のみ)性能が低下し、すべての行列に適用すると各行列に割り当てられるrankが減少し、かえって性能が低下した。

しかし、その後の研究と実務経験から、すべてのLinearレイヤーにLoRAを適用する方がより良い結果をもたらすケースが多いことが判明した。Sebastian Raschkaの実験によると、LLaMA-2 7BモデルでAttentionのQ, K, V, OおよびMLPのgate, up, down projectionまですべてのレイヤーにLoRAを適用した場合:

  • 学習可能パラメータ:4,194,304 -> 20,277,248(約5倍増加)
  • GPUメモリ:14.18 GB -> 16.62 GB(約17%増加)
  • 性能:顕著な改善

パラメータ数とメモリはやや増加するものの、性能対効率の比が優れているため、実務では target_modules="all-linear" の設定が推奨される傾向にある。

5.2 Rank選択ガイドライン

Rank選択に絶対的なルールはないが、以下のガイドラインを参考にできる:

ユースケース推奨Rank理由
単純なタスク適応(感情分類など)r=4〜8低いintrinsic dimensionで十分
一般的なInstruction tuningr=16〜32多様な指示への適応が必要
複雑なドメイン適応(医療、法律など)r=64〜256専門知識の表現により多くの容量が必要
性能最大化が目標の場合r=256+rsLoRAとの併用を推奨

Sebastian Raschkaの実験では、r=256がr=8、32、64、128より良い性能を示したが、r=512では逆に性能が低下する傾向が観察された。これは過度なrankがoverfittingを引き起こし得ることを示唆している。


6. QLoRA:4-bit量子化 + LoRA

6.1 QLoRAの概要

2023年にTim Dettmers et al.が発表したQLoRA(Quantized LoRA)は、LoRAのメモリ効率をさらに一段階引き上げた手法である。核心アイデアは、base modelの重みを4-bitで量子化して保存し、LoRA adapterのみを16-bit(またはBFloat16)で学習することである。

QLoRAの3つの技術的革新:

6.2 4-bit NormalFloat(NF4)

NF4はQLoRAで提案された新しいデータ型で、正規分布に従う重みに対して情報理論的に最適な量子化方式である。

事前学習済みニューラルネットワークの重みは一般的にゼロ中心の正規分布に従う。NF4はquantile quantizationを使用し、各量子化区間(bin)が目標正規分布で同数の期待値を表現するよう設計されている。これにより、従来のINT4やFP4より元の重み分布をはるかに正確に保存できる。

6.3 Double Quantization

Double Quantizationは、量子化定数(quantization constants)自体を再度量子化する手法である。Block-wise quantizationでは各ブロックにスケーリングファクターが必要だが、このスケーリングファクター自体を再度量子化することで、パラメータあたり平均約0.37ビットを追加で削減する。65Bモデル基準で約3GBのメモリを追加削減できる。

6.4 Paged Optimizers

Paged OptimizersはNVIDIA Unified Memoryを活用し、GPUメモリが飽和状態になるとオプティマイザ状態を自動的にCPUメモリへページアウトする手法である。長いシーケンス処理時に発生するgradient checkpointingメモリスパイクを効果的に処理する。CUDA Toolkit 6.0で導入されたUnified Memoryモデルに基づき、CPUとGPUが直接アクセスできる単一メモリ空間を活用する。

6.5 QLoRAの性能

QLoRAにより、65Bパラメータモデルを単一48GB GPUでFine-tuningできるようになり、16-bit Full Fine-tuningと同等のタスク性能を維持する。QLoRAで学習されたGuanacoモデルファミリーはVicunaベンチマークで以前のすべてのオープンモデルを上回り、ChatGPT性能の99.3%に到達した。これは単一GPUで24時間の学習だけで達成された結果である。

6.6 LoRA vs QLoRA比較

項目LoRA (16-bit)QLoRA (4-bit)
学習時間 (7B, 同一データ)~1.85時間~2.79時間
GPUメモリ~21.33 GB~14.18 GB
性能基準ほぼ同等(微差)
利点高速な学習少ないメモリ要件

QLoRAは約33%のメモリを削減する代わりに、量子化/逆量子化プロセスにより約39%の学習時間増加が発生する。メモリが制限された環境ではQLoRAが、学習速度が重要な環境ではLoRAがより適している。


7. HuggingFace PEFTライブラリ実習

7.1 インストール

pip install peft transformers trl datasets bitsandbytes accelerate

7.2 基本LoRA設定と学習

以下は、HuggingFace PEFTを使用してCausal Language ModelにLoRAを適用する基本的な例である。

from transformers import AutoModelForCausalLM, AutoTokenizer
from peft import LoraConfig, get_peft_model, TaskType
import torch

# 1. モデルとトークナイザーのロード
model_id = "meta-llama/Llama-2-7b-hf"
tokenizer = AutoTokenizer.from_pretrained(model_id)
model = AutoModelForCausalLM.from_pretrained(
    model_id,
    torch_dtype=torch.bfloat16,
    device_map="auto",
)

# 2. LoRA設定
lora_config = LoraConfig(
    r=16,                          # rank
    lora_alpha=32,                 # scaling factor (alpha)
    target_modules="all-linear",   # すべてのLinearレイヤーに適用
    lora_dropout=0.05,             # dropout比率
    bias="none",                   # bias学習を無効化
    task_type=TaskType.CAUSAL_LM,  # タスクタイプ
)

# 3. PEFTモデル作成
model = get_peft_model(model, lora_config)

# 4. 学習可能パラメータの確認
model.print_trainable_parameters()
# 出力例: trainable params: 20,277,248 || all params: 6,758,404,096 || trainable%: 0.30

7.3 SFTTrainerを活用したInstruction Tuning

TRLライブラリの SFTTrainer とPEFTを組み合わせることで、より簡潔にFine-tuningを実行できる。

from trl import SFTTrainer, SFTConfig
from peft import LoraConfig
from datasets import load_dataset

# データセットのロード
dataset = load_dataset("tatsu-lab/alpaca", split="train")

# LoRA設定
peft_config = LoraConfig(
    r=16,
    lora_alpha=32,
    lora_dropout=0.05,
    bias="none",
    task_type="CAUSAL_LM",
    target_modules=["q_proj", "k_proj", "v_proj", "o_proj",
                     "gate_proj", "up_proj", "down_proj"],
)

# SFTTrainerの設定と学習
trainer = SFTTrainer(
    model=model_id,
    args=SFTConfig(
        output_dir="./lora-output",
        num_train_epochs=1,
        per_device_train_batch_size=4,
        gradient_accumulation_steps=4,
        learning_rate=2e-4,
        bf16=True,
        logging_steps=10,
        save_strategy="epoch",
        max_seq_length=2048,
    ),
    train_dataset=dataset,
    peft_config=peft_config,
)

trainer.train()

# 学習済みadapterの保存
trainer.save_model("./lora-adapter")

7.4 QLoRA適用例

QLoRAを適用するには、bitsandbytes を使って4-bit量子化設定を追加する。

from transformers import AutoModelForCausalLM, BitsAndBytesConfig
from peft import LoraConfig, get_peft_model, prepare_model_for_kbit_training
import torch

# 4-bit量子化設定
bnb_config = BitsAndBytesConfig(
    load_in_4bit=True,                     # 4-bit量子化を有効化
    bnb_4bit_quant_type="nf4",             # NormalFloat4タイプを使用
    bnb_4bit_compute_dtype=torch.bfloat16, # 演算時にBFloat16を使用
    bnb_4bit_use_double_quant=True,        # Double Quantizationを有効化
)

# 量子化モデルのロード
model = AutoModelForCausalLM.from_pretrained(
    "meta-llama/Llama-2-7b-hf",
    quantization_config=bnb_config,
    device_map="auto",
)

# k-bit学習のためのモデル準備
model = prepare_model_for_kbit_training(model)

# LoRA設定(QLoRAでも同様に使用)
lora_config = LoraConfig(
    r=16,
    lora_alpha=32,
    target_modules="all-linear",
    lora_dropout=0.05,
    bias="none",
    task_type="CAUSAL_LM",
)

# PEFTモデル作成
model = get_peft_model(model, lora_config)
model.print_trainable_parameters()

7.5 学習済みAdapterのロードと推論

from peft import PeftModel, PeftConfig
from transformers import AutoModelForCausalLM, AutoTokenizer

# Baseモデルのロード
base_model = AutoModelForCausalLM.from_pretrained(
    "meta-llama/Llama-2-7b-hf",
    torch_dtype=torch.bfloat16,
    device_map="auto",
)
tokenizer = AutoTokenizer.from_pretrained("meta-llama/Llama-2-7b-hf")

# LoRA adapterのロード
model = PeftModel.from_pretrained(base_model, "./lora-adapter")

# (オプション)Adapterをbase modelにマージして推論速度を最適化
model = model.merge_and_unload()

# 推論
inputs = tokenizer("AIの未来は", return_tensors="pt").to(model.device)
outputs = model.generate(**inputs, max_new_tokens=100)
print(tokenizer.decode(outputs[0], skip_special_tokens=True))

8. LoRA vs Full Fine-tuning性能比較

8.1 原論文の結果(GPT-3 175B)

LoRA原論文で報告されたGPT-3 175Bの結果は以下の通りである:

MethodParamsWikiSQL Acc.MNLI-m Acc.SAMSum (R1/R2/RL)
Full Fine-tuning175B73.8%89.5%52.0/28.0/44.5
Prefix Tuning0.77M---
LoRA4.7M73.4%91.7%53.8/29.8/45.9
LoRA37.7M74.0%91.6%53.4/29.2/45.1

注目すべきは、LoRAがMNLIとSAMSumでFull Fine-tuningを上回ったことである。全体の0.003%にあたるわずか4.7Mパラメータの学習だけで、175B全体を学習したよりも良い結果を得た。これはLoRAのimplicit regularization効果と解釈される。すなわち、低ランク分解が一種の正則化の役割を果たし、overfittingを防止するのである。

8.2 推論性能と学習効率

指標Full Fine-tuningLoRA
学習速度基準約25%高速
VRAM使用量基準約67%削減
推論レイテンシ基準同等(マージ後)
マルチタスク切替モデル全体の交換が必要Adapterのみ交換

8.3 LoRAの限界

LoRAが常にFull Fine-tuningと同等であるわけではない。最近の研究(Biderman et al., 2024, "LoRA vs Full Fine-tuning: An Illusion of Equivalence")では以下が指摘されている:

  1. SVD構造の違い:LoRAとFull Fine-tuningで学習された重み行列のSingular Value Decomposition構造が異なる。
  2. 分布外汎化(OOD Generalization):学習データ分布から外れた入力に対して、LoRAとFull Fine-tuningモデルが異なる汎化パターンを示す。
  3. データセットサイズ依存性:データセットサイズがLoRAの学習可能パラメータ数を大幅に超える場合、Full Fine-tuningが優位になり得る。

したがって、LoRAを適用する際は、タスクの複雑さとデータセット規模を考慮してrankとtarget modulesを適切に設定する必要がある。


9. 実務Tips:Learning Rate、Rank、Alpha調整

9.1 Learning Rate

  • LoRAではFull Fine-tuningの約10倍高いlearning rateが必要である。Full Fine-tuningで1e-5〜3e-5を使用するなら、LoRAでは1e-4〜3e-4の範囲が適切である。
  • Learning rateは他のハイパーパラメータより先に最適化すべきである。RankとalphaのEffectがlearning rateに依存するためだ。
  • Cosine annealingスケジューラはSGDでは効果的だが、Adam/AdamWでは影響が微小である。

9.2 Rank(r)設定

  • 開始点:r=16から始め、性能を評価した後、必要に応じて調整する。
  • 過少設定のリスク:Rankが低すぎるとタスクに必要な表現力が不足する。
  • 過大設定のリスク:Rankが高すぎるとoverfittingが発生し、メモリと計算コストが増加する。
  • rsLoRAの活用:r=32以上の高いrankを使用する場合は use_rslora=True を設定し、スケーリングファクターを αr\frac{\alpha}{\sqrt{r}} に調整するのがよい。高rankでの学習安定性が改善される。

9.3 Alpha設定

  • 一般的なヒューリスティックalpha = 2 * r と設定する。つまり、rankが16ならalphaは32に設定する。
  • この比率は多くの場合良い結果を示すが、最適な比率はモデルとデータセットによって異なり得る。
  • Sebastian Raschkaの実験では、r=256、alpha=128(0.5倍比率)がより良い結果を示したケースもあった。

9.4 Dropout

  • LoRA dropoutは一般的に0.05〜0.1の範囲に設定する。
  • データセットが小さい場合やoverfittingが懸念される場合は0.1、大規模データセットでは0.05または無効化(0.0)を検討する。

9.5 オプティマイザ選択

  • AdamW:最も安定的で広く使われる選択肢である。
  • SGD:低いrankではAdamWとのメモリ差は微小だが、高いrank(r=256)では有意なメモリ削減が可能(17.86 GB vs 14.46 GB)。
  • 多くの場合AdamWをデフォルトとして使用し、メモリが極めて制限された環境で高いrankを使用する必要がある場合にSGDを検討する。

9.6 データセット関連Tips

  • マルチエポック学習に注意:同一データセットを複数回繰り返すとoverfittingが発生し得る。Sebastian Raschkaの実験では、Alpacaデータセットで2エポック学習した際に性能がかえって低下した。
  • データ品質が量に勝る:1K例のLIMAデータセットが50K例のAlpacaデータセットと同等またはそれ以上の結果を示したケースがある。高品質データセットの構築がハイパーパラメータチューニングより重要である可能性がある。

9.7 実践設定テンプレート

以下は実務ですぐに活用できるLoRA設定テンプレートである。

from peft import LoraConfig

# 一般的なInstruction Tuning設定
config_standard = LoraConfig(
    r=16,
    lora_alpha=32,
    target_modules="all-linear",
    lora_dropout=0.05,
    bias="none",
    task_type="CAUSAL_LM",
)

# メモリ節約優先設定(QLoRAと併用)
config_memory_efficient = LoraConfig(
    r=8,
    lora_alpha=16,
    target_modules=["q_proj", "v_proj"],
    lora_dropout=0.1,
    bias="none",
    task_type="CAUSAL_LM",
)

# 性能最大化設定
config_high_performance = LoraConfig(
    r=64,
    lora_alpha=128,
    target_modules="all-linear",
    lora_dropout=0.05,
    bias="none",
    task_type="CAUSAL_LM",
    use_rslora=True,  # 高rankでRank-Stabilized LoRAを使用
)

10. LoRAエコシステムと変形手法

LoRAの成功以降、様々な変形手法が登場した。簡潔にまとめると以下の通りである:

手法核心アイデアPEFT対応
LoRA低ランク行列分解(BA)O
QLoRA4-bit量子化 + LoRAO
DoRAWeight-Decomposed LoRA(方向/大きさ分離)O
AdaLoRA重要度ベースのrank動的割り当てO
LoHaHadamard Productベース分解O
LoKrKronecker Productベース分解O
PiSSAPrincipal Singular Valuesベース初期化O
rsLoRARank-StabilizedスケーリングファクターO

HuggingFace PEFTライブラリはこれらすべての手法を LoraConfig のオプションや個別のConfigクラスでサポートしており、最小限のコード変更で様々な手法を実験できる。


11. おわりに

LoRAは「事前学習済みモデルの重み変化量が低いintrinsic rankを持つ」という簡潔な仮説から出発し、大規模言語モデルのFine-tuningコストを劇的に削減した手法である。数学的に優雅であること、実装が簡単であること、推論時に追加コストがないことの3つの利点が、LoRAを現在のLLMファインチューニングの標準にした。

QLoRAの登場によりコンシューマー向けGPUでも大規模モデルのFine-tuningが可能になり、HuggingFace PEFTライブラリはこれらの手法をわずか数行のコードで適用できるようにした。LLMを活用したプロジェクトに取り組むなら、LoRAは必ず習得すべき核心技術である。


References

  1. Hu, E. J., Shen, Y., Wallis, P., Allen-Zhu, Z., Li, Y., Wang, S., Wang, L., & Chen, W. (2021). LoRA: Low-Rank Adaptation of Large Language Models. arXiv. https://arxiv.org/abs/2106.09685

  2. Dettmers, T., Pagnoni, A., Holtzman, A., & Zettlemoyer, L. (2023). QLoRA: Efficient Finetuning of Quantized LLMs. arXiv. https://arxiv.org/abs/2305.14314

  3. Aghajanyan, A., Gupta, S., & Zettlemoyer, L. (2020). Intrinsic Dimensionality Explains the Effectiveness of Language Model Fine-Tuning. arXiv. https://arxiv.org/abs/2012.13255

  4. HuggingFace PEFT - LoRA Documentation. https://huggingface.co/docs/peft/en/package_reference/lora

  5. HuggingFace PEFT - LoRA Methods Guide. https://huggingface.co/docs/peft/en/task_guides/lora_based_methods

  6. HuggingFace PEFT GitHub Repository. https://github.com/huggingface/peft

  7. Microsoft LoRA GitHub Repository. https://github.com/microsoft/LoRA

  8. Raschka, S. (2023). Practical Tips for Finetuning LLMs Using LoRA (Low-Rank Adaptation). Sebastian Raschka's Magazine. https://magazine.sebastianraschka.com/p/practical-tips-for-finetuning-llms

  9. Biderman, S., et al. (2024). LoRA vs Full Fine-tuning: An Illusion of Equivalence. arXiv. https://arxiv.org/abs/2410.21228

  10. Kalajdzievski, D. (2023). Rank-Stabilized LoRA (rsLoRA). arXiv. https://arxiv.org/abs/2312.03732

  11. Liu, S., et al. (2024). DoRA: Weight-Decomposed Low-Rank Adaptation. arXiv. https://arxiv.org/abs/2402.09353

  12. HuggingFace Blog - Making LLMs even more accessible with bitsandbytes, 4-bit quantization and QLoRA. https://huggingface.co/blog/4bit-transformers-bitsandbytes