UnslothではじめるLLMのFine-tuning

大規模言語モデル(LLM)を特定のタスクやドメインに特化させる「ファインチューニング」。その可能性に多くの開発者が惹きつけられる一方で、「膨大な計算コストがかかる」「高性能なGPUがなければ手も足も出ない」といった高いハードルに、挑戦をためらっている方も多いのではないでしょうか。

今回紹介するUnslothは、そんな常識を覆す画期的なPythonパッケージです。Unslothは、LoRAという効率的なファインチューニング手法を極限まで最適化することで、訓練を最大30%高速化し、メモリ使用量を最大70%も削減します。これにより、これまで大規模な計算環境が必要だったLLMのカスタマイズが、個人のPCでも現実的なものになります。

この記事では、ファインチューニングの基礎知識から、Unslothの機能、そして具体的なコードを用いた実装方法を解説します。

LLMの訓練とファインチューニング

LLMがどのようにして人間のように対話したり、文章を生成したりする能力を獲得するのか、その訓練プロセスは大きく3つの段階に分けられます。まずは、この全体像を理解することから始めましょう。

LLM訓練の3つのフェーズ

  1. 事前学習(Pre-training): LLMの「基礎体力」を作る段階です。インターネット上の膨大なテキストデータを学習し、言語の文法や単語間の関係性といった、汎用的な言語パターンを習得します。この段階のモデルは、文章の続きを予測することは得意ですが、ユーザーの具体的な指示に従うことはまだできません。
  2. インストラクション・チューニング(Instruction Tuning): 事前学習済みのモデルに、「指示(Instruction)」に従う能力を教え込む段階です。例えば、「〇〇について要約して」という指示に対し、適切な要約文を生成するといった、具体的なタスクをこなせるようにします。これは、人間が作成した「指示とその望ましい応答」のペアデータを大量に学習させることで実現されます。
  3. アライメント(Alignment): モデルの応答を、人間の価値観や倫理観に沿うように調整する最終段階です。より安全で、役に立ち、人間にとって好ましい応答を生成するようにモデルを「しつけ」ます。このプロセスでは、人間からのフィードバックを利用した強化学習(RLHF: Reinforcement Learning from Human Feedback)などの手法が用いられます。

ファインチューニングとは?

上記で触れたインストラクション・チューニングやアライメントは、広義の意味で「ファインチューニング」の一種です。ここでのファインチューニングとは、事前学習された汎用的なモデルを、特定のタスクやデータセットに適応させるために追加で訓練することを指します。

ゼロから巨大なモデルを開発するのに比べ、計算コストを大幅に抑えつつ、特定の目的に特化した高性能なモデルを作成できるため、非常に重要な技術とされています。

ファインチューニングの手法

ファインチューニングには、大きく分けて2つのアプローチがあります。

  • Full Fine-tuning: モデルの全てのパラメータを更新します。性能向上は最も見込めますが、膨大な計算リソース(特にVRAM)を必要とします。
  • PEFT (Parameter-Efficient Fine-tuning): モデルのごく一部のパラメータのみを更新するか、少数の新しいパラメータを追加して訓練する方法です。計算コストを劇的に削減でき、Unslothが採用しているLoRAもこの一種です。
図2. LoRA (https://arxiv.org/pdf/2106.09685 より引用)

強化学習によるアライメント手法

アライメントのフェーズでは、モデルの振る舞いをより良くするために様々な強化学習アルゴリズムが利用されます。特に、人間の「好み」のデータを直接利用する手法が近年注目されています。以下に代表的な手法をまとめました。

手法概要仕組み特徴
PPO報酬モデルを利用する古典的な強化学習手法。ChatGPTの初期モデルで採用。①人間の評価データで「報酬モデル」を訓練。②その報酬を最大化するようにLLMを更新する。実績豊富だが、報酬モデルの訓練が必要でプロセスが複雑。
DPO報酬モデルを不要とし、選好データから直接LLMを最適化する手法。「選ばれた応答」の確率を上げ、「拒否された応答」の確率を下げるように直接学習する。シンプルで安定しており、PPOと同等以上の性能が出ることが多い。
KTODPOをさらに発展させ、ペアデータだけでなく「良い/悪い」のラベルでも学習可能にした手法。人間の損失回避性を考慮し、「良い応答」と「悪い応答」で重みを変えて最適化する。データ形式の柔軟性が高く、より人間の感覚に近い調整を目指す。
SimPODPOをさらに簡素化した目的関数を用いる手法。DPOの目的関数から一部の項を省略し、より直接的に選好された応答の確率を最大化する。実装が非常にシンプルで、計算効率が良い可能性がある。

LoRAとアライメント手法の役割分担

ここで重要なのは、LoRADPOのようなアライメント手法の関係性です。両者は目的が異なり、協調して使われます。

  • LoRA:どのようにモデルの重みを効率的に更新するか」という技術(PEFT)です。
  • DPOなど:何を目標にモデルを最適化するか」という目的(アライメント)です。

つまり、「DPOという目的を達成するために、LoRAという効率的な技術を使ってモデルを訓練する」という関係になります。この2つの組み合わせが、unslothのようなツールで効率的なファインチューニングを実現する鍵となります。

比較軸LoRAのみ(知識・スタイルの学習)DPOなど(振る舞いの学習)
主な目的新しい知識の獲得、専門分野への特化出力品質の向上、安全性確保、指示追従性の改善
学習対象事実情報、専門用語、特定の文体望ましい振る舞い、倫理観、出力フォーマット
入力データテキスト、Q&Aデータ人間の選好データ(AよりBが良い、など)
得意なこと「何を知っているか」を教える「どう振る舞うべきか」を教える

Unsloth パッケージとは?

Unslothは、大規模言語モデル(LLM)のファインチューニングを、より速く、より少ないメモリ(VRAM)で、そしてより簡単に実行するために設計されたPythonパッケージです。これまで専門家や潤沢な資金を持つ組織の領域だったLLMのカスタマイズを、個人の開発者や研究者でも可能にします。

Unslothの3つの柱

Unslothの強力な機能は、主に以下の3つの柱によって支えられています。

  1. 超効率的なLoRA実装: ファインチューニングの速度とメモリ効率を極限まで高めます。
  2. Hugging Faceとのシームレスな統合: transformerstrlといった業界標準ライブラリと連携し、既存の資産や知識を活かせます。
  3. ユーザーフレンドリーなAPI: 複雑な設定を自動化し、数行のコードで誰でも簡単にファインチューニングを始められます。

1. 超効率的なLoRA実装

Unslothの最大の特長は、PEFT手法の一種であるLoRA(Low-Rank Adaptation)を、GPUの動作レベルから徹底的に最適化している点です。

  • 驚異的なパフォーマンス: 通常のLoRA実装と比較して、訓練速度を最大30%向上させ、LLMのファインチューニングで最もボトルネックとなるVRAM使用量を最大70%も削減します。
  • パーソナルGPUでの実現: このメモリ削減効果により、従来は不可能だった大規模モデルのファインチューニングが、24GB程度のVRAMを搭載した個人向けGPUでも実行可能になります。
  • 開発サイクルの短縮: 訓練時間が短くなることで、より多くの実験を短期間で回せるようになり、モデルの改善スピードが飛躍的に向上します。

2. Hugging Faceとのシームレスな統合

Unslothは、LLM開発のエコシステムの中心であるHugging Faceと深く連携するように設計されています。

  • 豊富な対応モデル: Llama-3, Mistral, Gemma, Phi-3など、Hugging Face Hubで公開されている人気のLLMの多くを、簡単なコードで読み込んでファインチューニングのベースとして利用できます。
  • trlライブラリとの連携: Hugging Faceが提供するtrlライブラリと組み合わせることで、単純な知識学習(SFT)だけでなく、前章で解説したDPOのような高度なアライメント調整も、unslothの高速・省メモリの恩恵を受けながら実行できます。
  • 低い学習コスト: すでにHugging Faceのtransformersライブラリに慣れているユーザーであれば、新しい作法をほとんど学ぶことなく、直感的にUnslothを使いこなせます。

3. ユーザーフレンドリーなAPI

Unslothは、パフォーマンスだけでなく、その「使いやすさ」にも徹底的にこだわっています。

  • シンプルなコード: モデルの読み込みからLoRAの適用、訓練の実行までが、非常に簡潔で直感的なコードで完結します。
  • 最適化の自動化: ユーザーが意識しなくても、Flash Attention 2のような最新の高速化技術や、bfloat16といった効率的なデータ型が内部で自動的に適用され、最高のパフォーマンスを引き出します。
  • 参入障壁の低減: LLMやGPUに関する深い知識がなくても、公式ドキュメントのサンプルコードを参考にすれば、誰でもすぐにファインチューニングを始めることができます。

このようにUnslothは、「高速性」「低VRAM消費」「使いやすさ」を高いレベルで兼ね備えることで、LLMのファインチューニングという最先端技術への扉を、すべての人に開いてくれる画期的なツールなのです。

Unslothを使ってみる

ここでは、公式に提供されているサンプルコードを元に、環境構築からモデルの読み込み、そして訓練の実行までの一連の流れを、ステップごとに解説していきます。

環境構築

まずは、Unslothと関連ライブラリをインストールします。UnslothはPyTorchベースで動作し、執筆時点ではPython 3.12までをサポートしています。Linux環境が推奨されていますが、Windowsでも利用可能です。

# PyTorch本体をインストール
$ pip install torch torchvision torchaudio

# Unslothが依存するライブラリをインストール
# xformers: 高速なAttention計算などを提供
# BitsandBytes: 量子化などメモリ効率化のためのライブラリ
$ pip install xformers BitsandBytes triton 

# Unsloth本体をインストール
$ pip install unsloth

ファインチューニングの実践

環境が整ったら、Pythonスクリプトを書いていきましょう。コードをいくつかのブロックに分けて解説します。

ステップ1: ライブラリのインポートと基本設定

まず、ファインチューニングに必要なライブラリをインポートし、モデルが扱うトークン長の最大値を設定します。

from unsloth import FastLanguageModel
import torch
from trl import SFTTrainer, SFTConfig
from datasets import load_dataset

# モデルが処理するシーケンスの最大長を設定
# Unslothは内部でRoPEスケーリングをサポートしているため、比較的自由に設定可能
max_seq_length = 2048 
  • FastLanguageModel: Unslothの心臓部です。モデルの読み込みやLoRAの適用を高速かつ効率的に行います。
  • SFTTrainer: Hugging Faceのtrlライブラリに含まれる、教師ありファインチューニング(Supervised Fine-Tuning)を簡単に行うためのクラスです。
  • datasets: Hugging Faceのデータセットを簡単に扱うためのライブラリです。

ステップ2: データセットの準備

次に、ファインチューニングに使用するデータセットを読み込みます。ここではHugging Face Hubで公開されているデータセットを例として使用します。

# Hugging Face Hubから学習用のデータセットを読み込む
# ここではLAIONのデータセットを例として使用
url = "https://huggingface.co/datasets/laion/OIG/resolve/main/unified_chip2.jsonl"
dataset = load_dataset("json", data_files={"train": url}, split="train")

今回はサンプルとして公開データセットを使いますが、実際にはここに自社データや特定のタスクに特化したデータを読み込ませることになります。

ステップ3: モデルとトークナイザの読み込み

いよいよUnslothを使って、ファインチューニングのベースとなるLLMを読み込みます。ここがUnslothの真骨頂の一つです。

# Unslothが提供する事前量子化済みモデルをロードする
# 4bitで量子化されているため、ダウンロードが高速でメモリ消費も少ない
model, tokenizer = FastLanguageModel.from_pretrained(
    model_name="unsloth/gemma-2-9b-bnb-4bit",  # ここで好きなモデルを選べる
    max_seq_length=max_seq_length,          # ステップ1で設定した最大長
    load_in_4bit=True,                      # 4bit量子化を有効にする
    # token = "hf_...", # Gemmaなど、アクセスにトークンが必要なモデルの場合
)

Unslothは、多くの人気モデルを4bit量子化済みの形式で提供しています(unsloth/で始まるモデル名が目印)。これにより、モデルをGPUにロードする際のVRAM使用量を劇的に削減できます。load_in_4bit=Trueがその設定です。

ステップ4: LoRAアダプターの適用

次に、読み込んだモデルにUnslothが最適化したLoRAアダプターを適用します。この処理により、モデルはPEFT(Parameter-Efficient Fine-tuning)の準備が整います。

# モデルにUnsloth独自の高速なLoRAアダプターを適用する
model = FastLanguageModel.get_peft_model(
    model,
    r=16,  # LoRAのランク。数値が大きいほど表現力は増すが、パラメータ数も増える
    target_modules=["q_proj", "k_proj", "v_proj", "o_proj",
                    "gate_proj", "up_proj", "down_proj",], # LoRAを適用する層
    lora_alpha=16, # LoRAのスケーリング係数
    lora_dropout=0, # ドロップアウト率。0が最も最適化されている
    bias="none",    # バイアスは使用しない("none"が最適化されている)
    # "unsloth"を指定するとVRAM使用量が30%削減され、バッチサイズを2倍にできる
    use_gradient_checkpointing="unsloth", 
    random_state=3407,
    max_seq_length=max_seq_length,
)

get_peft_modelが、モデルの各層(target_modulesで指定)に小さなLoRAアダプター(重み行列)を挿入する関数です。訓練中は、このアダプターの重みだけが更新されます。特にuse_gradient_checkpointing="unsloth"は、さらなる省メモリ化を実現するUnsloth独自のオプションです。

ステップ5: 訓練の実行

最後に、trlSFTTrainerを使って訓練を設定し、実行します。

trainer = SFTTrainer(
    model=model,
    train_dataset=dataset,
    tokenizer=tokenizer,
    args=SFTConfig(
        max_seq_length=max_seq_length,
        per_device_train_batch_size=2, # バッチサイズ
        gradient_accumulation_steps=4, # 勾配を蓄積するステップ数
        warmup_steps=10,               # 学習率を徐々に上げるウォームアップステップ数
        max_steps=60,                  # 最大訓練ステップ数
        logging_steps=1,               # ログを出力する間隔
        output_dir="outputs",          # 結果の出力先ディレクトリ
        optim="adamw_8bit",            # メモリ効率の良い8bit AdamWオプティマイザ
        seed=3407,
    ),
)

# 訓練を開始
trainer.train()

SFTConfigでバッチサイズや訓練ステップ数などのハイパーパラメータを細かく設定できます。設定が完了したら、trainer.train()を呼び出すだけで、Unslothによる高速なファインチューニングが開始されます。

以上が、Unslothを使ったファインチューニングの基本的な流れです。少ないコードと設定で、強力なLLMを簡単にカスタマイズできることが分かるかと思います。

おわりに

本記事では、LLMのファインチューニングを驚くほど高速かつ省メモリで実現するUnslothパッケージについて、その仕組みから具体的な実践方法までを解説しました。Unslothを使えば、これまで専門的な環境が必要だったモデルのカスタマイズが、個人のPCでも手軽に試せることがお分かりいただけたかと思います。

今回は基本的な教師ありファインチューニング(SFT)を紹介しましたが、Unslothの真価はそれだけにとどまりません。DPOのような強化学習ベースのアライメント手法もサポートしており、モデルの出力品質や安全性をさらに高いレベルで追求することも可能です。

LLMのファインチューニングの世界は奥深く、Unsloth以外にもAxolotlLlamaFactoryDeepSpeedなど、様々な特性を持つ優れたツールが存在します。それぞれに長所がありますが、特に「手軽に、速く始めたい」という方にとって、Unslothは最適な選択肢の一つとなるでしょう。この記事が、皆さんのLLM開発の第一歩を踏み出すきっかけとなれば幸いです。

More Information

  • arXiv:2106.09685, Edward J. Hu et al., 「LoRA: Low-Rank Adaptation of Large Language Models」, https://arxiv.org/abs/2106.09685
  • arXiv:2404.10779, Mathav Raj J et al., 「Fine Tuning LLM for Enterprise: Practical Guidelines and Recommendations」, https://arxiv.org/abs/2404.10779
  • arXiv:2407.11046, Yuren Mao et al., 「A Survey on LoRA of Large Language Models」, https://arxiv.org/abs/2407.11046
  • arXiv:2408.13296, Venkatesh Balavadhani Parthasarathy et al., 「The Ultimate Guide to Fine-Tuning LLMs from Basics to Breakthroughs: An Exhaustive Review of Technologies, Research, Best Practices, Applied Research Challenges and Opportunities」, https://arxiv.org/abs/2408.13296
  • arXiv:2502.21321, Komal Kumar et al., 「LLM Post-Training: A Deep Dive into Reasoning Large Language Models」, https://arxiv.org/abs/2502.21321