🤗 PEFT ライブラリのリリースにより、パラメータ効率の高いファインチューニングが可能に、数十億規模モデル

TL;DR

Hugging Face は 🤗 PEFT ライブラリをリリースし、数メガバイトの学習可能な重みだけで大規模言語モデルのパラメータ効率的ファインチューニング(PEFT)を可能にし、コンシューマー向け GPU でも数十億規模モデルを適応できるようにしました。

動機: PEFT が重要な理由

PEFT 手法は、事前学習済みモデルの大部分を凍結したまま、追加の少数パラメータのみを学習します。これにより計算コストとストレージコストの両方が削減され、破滅的忘却を防ぎ、データが少ない状況ではフルファインチューニングを上回ることが多いです。このアプローチはテキスト、ビジョン、オーディオといった様々なモダリティで機能し、単一のベースモデルが多数の下流タスクに対して、極小のアダプタチェックポイントで対応できるようになります。

サポートされている PEFT 手法

🤗 PEFT ライブラリは現在、広く引用されている 4 つの手法を実装しています。

  1. LoRA – 大規模言語モデルの低ランク適応(Low‑Rank Adaptation of Large Language Models、Hu et al., 2021)。
  2. Prefix Tuning – P‑Tuning v2。各トランスフォーマーレイヤーの先頭に学習可能なベクトルを付加します。
  3. Prompt Tuning – タスク横断的にプロンプトベースの適応を拡張します。
  4. P‑Tuning – GPT 系モデル向けに連続的プロンプトを直接最適化します。

今後のリリースで追加の手法が計画されています。

代表的なユースケース

  • ノートパソコン GPU(11 GB RAM)上で 3 B パラメータの T0 モデルを LoRA と 🤗 Accelerate の DeepSpeed 統合を用いてファインチューニング。サンプルスクリプト peft_lora_seq2seq_accelerate_ds_zero3_offload.py は Google Colab で実行できます。
  • Colab で bitsandbytes ライブラリを使用した OPT‑6.7B の INT8 LoRA チューニング。8 ビット量子化と PEFT の組み合わせで、比較的少ない GPU メモリに収まることを示しています。
  • コンシューマー向け GPU(RTX 2080 Ti、RTX 3080)上で LoRA を用いた Stable Diffusion DreamBooth。公開されている Gradio デモは T4(16 GB)インスタンスで動作します。

これらの例は、以前は数十 GB の VRAM が必要だったモデルが、現在では多くの実務者が利用できるハードウェア上で適応可能であることを示しています。

クイックスタート: LoRA で bigscience/mt0-large をファインチューニング

from transformers import AutoModelForSeq2SeqLM
from peft import get_peft_model, LoraConfig, TaskType

model_name = "bigscience/mt0-large"
model = AutoModelForSeq2SeqLM.from_pretrained(model_name)

peft_cfg = LoraConfig(
    task_type=TaskType.SEQ_2_SEQ_LM,
    inference_mode=False,
    r=8,
    lora_alpha=32,
    lora_dropout=0.1,
)
model = get_peft_model(model, peft_cfg)
model.print_trainable_parameters()
# → trainable params: 2,359,296 | all params: 1,231,940,608 | trainable %: 0.19

トレーニングループの残りの部分は変更不要です。トレーニング後はアダプタファイルのみが保存されます:

model.save_pretrained("output_dir")  # creates adapter_config.json + adapter_model.bin (~19 MB)

推論時にロードするには:

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

peft_id = "smangrul/twitter_complaints_bigscience_T0_3B_LORA_SEQ_2_SEQ_LM"
cfg = PeftConfig.from_pretrained(peft_id)
base = AutoModelForSeq2SeqLM.from_pretrained(cfg.base_model_name_or_path)
model = PeftModel.from_pretrained(base, peft_id)
 tokenizer = AutoTokenizer.from_pretrained(cfg.base_model_name_or_path)

model.eval().to("cuda")
inputs = tokenizer("Tweet text : @HondaCustSvc ...", return_tensors="pt")
with torch.no_grad():
    out = model.generate(inputs["input_ids"].to("cuda"), max_new_tokens=10)
    print(tokenizer.decode(out[0], skip_special_tokens=True))
# → "complaint"

アダプタチェックポイントは数メガバイトに過ぎませんが、フルファインチューニングに匹敵する性能を発揮します。

今後の方向性

Hugging Face は IA³ やボトルネックアダプタなど、さらなる PEFT バリアントの追加を計画しています。今後のユースケースとしては、Colab で whisper-large の INT8 トレーニングや、RLHF コンポーネント(ポリシーおよびランカー・モデル)への PEFT の適用が挙げられます。コミュニティからの貢献は GitHub リポジトリを通じて奨励されています。

結論

🤗 PEFT は、ハードウェア、計算、ストレージのハードルを大幅に下げつつ精度を維持することで、数十億規模モデルの適応を民主化します。ライブラリは 🤗 Transformers と 🤗 Accelerate とシームレスに統合されており、既存のパイプラインに PEFT を簡単に組み込み、タスク間で軽量アダプタを共有することが容易です。

Sources