Unsloth: 大規模言語モデルのファインチューニングを2倍速く、メモリ使用量を70%削減する方法

## はじめに

大規模言語モデル（LLM）の時代、GPT-4やLlama 3などの強力なモデルが次々と登場していますが、これらのモデルを自分のタスクに合わせてファインチューニングするのは、計算リソースの観点から大きな課題です。特に、数十GBものGPUメモリが必要とされることが多く、個人や小規模な組織にとっては大きな障壁となっています。

この記事では、Unslothというオープンソースツールを紹介します。Unslothは大規模言語モデルのファインチューニングを従来の手法と比較して**2倍速く**、**メモリ使用量を最大70%削減**できる革新的なソリューションです。今回は特に、Unslothの基本的な使い方と、なぜこれほどの効率化が可能なのかについて、初心者にも分かりやすく解説します。

## Unslothとは？

Unslothは、大規模言語モデルのファインチューニングを効率化するためのオープンソースライブラリです。2023年に開発が始まり、GitHub上で急速に人気を集めています。その名前の由来はナマケモノ（Sloth）からきており、「遅くない（Un-sloth）」という意味が込められています。

### 主な特徴

- **高速化**: ファインチューニングの速度を約2倍に向上
- **メモリ効率**: GPUメモリ使用量を最大80%削減
- **互換性**: Llama 3.3、Mistral、Phi-4、Qwen 2.5、Gemmaなど多数のモデルをサポート
- **低リソース**: 通常なら40GB以上のメモリが必要なモデルを、8GBのGPUでファインチューニング可能
- **正確性**: 近似手法を使わないため、精度の低下がない（0%の損失）
- **使いやすさ**: 初心者フレンドリーなGoogle Colabノートブックを提供

## なぜUnslothは速いのか？

Unslothが従来のファインチューニング手法よりも高速かつメモリ効率が良い理由は、いくつかの革新的な技術にあります。主な技術ポイントを見ていきましょう。

### 1. OpenAIのTritonによるカスタムカーネル

Unslothは全てのカーネル（計算の中核部分）をOpenAIが開発したTritonという言語で書かれています。Tritonは、GPUの並列計算能力を最大限に活用するために設計された専用プログラミング言語です。これにより、Transformersベースのモデルに対して高度に最適化された計算が実現されています。

### 2. 手動バックプロパゲーションエンジン

通常の深層学習フレームワークでは、自動微分を使って勾配を計算しますが、Unslothはバックプロパゲーション（逆伝播）を手動で最適化しています。これにより、メモリ効率が大幅に向上し、無駄な中間計算結果の保存を削減しています。

### 3. 賢いメモリ管理

Unslothは「Unsloth gradient checkpointing」という独自のアルゴリズムを実装しています。これにより、中間的な活性化値をシステムRAMに非同期でオフロードし、GPUメモリの使用を大幅に削減しています。この手法は従来より30%少ないメモリで動作し、長いコンテキストウィンドウ（文脈長）をサポートしています。

### 4. 効率的なQLoRA実装

QLoRA（Quantized Low-Rank Adaptation）は、モデルを4ビット精度に量子化し、少ないパラメータ数でファインチューニングを可能にする手法です。Unslothは、QLoRAの実装を最適化し、メモリ使用量をさらに削減しています。

## 実際のメモリと速度の向上

UnslothとHugging Face + FA2（Flash Attention 2）を比較したベンチマークを見てみましょう：

| モデル | VRAM | 🦥 Unsloth速度 | 🦥 VRAM削減 | 🦥 長いコンテキスト | 😊 Hugging Face + FA2 |
|--------|------|--------------|------------|-----------------|----------------------|
| Llama 3.3 (70B) | 80GB | 2x | >75% | 13倍長い | 1x |
| Llama 3.1 (8B) | 80GB | 2x | >70% | 12倍長い | 1x |

このように、Unslothは同じハードウェアでより効率的にファインチューニングを行えるだけでなく、より長いコンテキスト長を扱えることも大きな利点です。

## 始め方

Unslothを使い始めるには、以下の簡単なステップに従うだけです。

### インストール方法

Linuxマシンでは、pipを使用して簡単にインストールできます：

```bash
pip install unsloth
```

より細かいインストール方法（CUDAバージョンやPyTorchバージョンに応じた方法）も提供されていますが、基本的なインストールは上記のコマンドだけで済みます。

### 基本的な使用方法

以下は、Unslothを使用してモデルをファインチューニングする基本的なコード例です：

```python
from unsloth import FastLanguageModel
from unsloth import is_bfloat16_supported
import torch
from trl import SFTTrainer
from transformers import TrainingArguments
from datasets import load_dataset

max_seq_length = 2048  # RoPEスケーリングを内部でサポート

# データセットの読み込み
url = "https://huggingface.co/datasets/laion/OIG/resolve/main/unified_chip2.jsonl"
dataset = load_dataset("json", data_files = {"train" : url}, split = "train")

# モデルのロード（4ビット量子化版）
model, tokenizer = FastLanguageModel.from_pretrained(
    model_name = "unsloth/llama-3-8b-bnb-4bit",
    max_seq_length = max_seq_length,
    dtype = None,
    load_in_4bit = True,
)

# モデルのパッチ適用とLoRAウェイトの追加
model = FastLanguageModel.get_peft_model(
    model,
    r = 16,
    target_modules = ["q_proj", "k_proj", "v_proj", "o_proj",
                      "gate_proj", "up_proj", "down_proj",],
    lora_alpha = 16,
    lora_dropout = 0,  # 0に設定すると最適化される
    bias = "none",     # "none"に設定すると最適化される
    use_gradient_checkpointing = "unsloth",  # 30%少ないVRAM、2倍大きなバッチサイズが可能
    random_state = 3407,
    max_seq_length = max_seq_length,
)

# トレーナーの設定
trainer = SFTTrainer(
    model = model,
    train_dataset = dataset,
    dataset_text_field = "text",
    max_seq_length = max_seq_length,
    tokenizer = tokenizer,
    args = TrainingArguments(
        per_device_train_batch_size = 2,
        gradient_accumulation_steps = 4,
        warmup_steps = 10,
        max_steps = 60,
        fp16 = not is_bfloat16_supported(),
        bf16 = is_bfloat16_supported(),
        logging_steps = 1,
        output_dir = "outputs",
        optim = "adamw_8bit",
        seed = 3407,
    ),
)

# トレーニングの実行
trainer.train()
```

## 無料で使える様々なノートブック

Unslothの素晴らしい点の一つは、様々なモデルに対応した初心者フレンドリーなGoogle Colabノートブックを提供していることです。これらのノートブックを使えば、自分のデータセットを追加し、「すべて実行」をクリックするだけで、2倍速いファインチューニングモデルを得ることができます。

以下は、提供されている主なノートブックの一部です：

- **Llama 3.2 (3B)**: 2倍速、70%メモリ削減
- **GRPO (R1 reasoning)**: 2倍速、80%メモリ削減
- **Phi-4 (14B)**: 2倍速、70%メモリ削減 
- **Llama 3.2 Vision (11B)**: 2倍速、50%メモリ削減
- **Llama 3.1 (8B)**: 2倍速、70%メモリ削減

これらのノートブックは、[Unslothの公式ドキュメント](https://docs.unsloth.ai/)で確認できます。

## 最近の進化: GRPO（推論能力の向上）

直近のUnslothの大きな進化の一つが、GRPO（Gradient-based Reinforcement from Policy Optimization）のサポートです。GRPOは、DeepSeekが開発した手法で、LLMに推論能力を付与するために使用されています。

Unslothの「Efficient GRPO」アルゴリズムにより、通常のGRPO実装に比べて**10倍長いコンテキスト長**かつ**90%少ないVRAM**でトレーニングが可能になりました。例えば、20Kコンテキスト長でのLlama 3.1 (8B)のトレーニングが、510.8GBから54.3GBのVRAMに削減されています。

これにより、より小さなGPUでも高度な推論能力を持つモデルをトレーニングできるようになりました。Qwen2.5 (1.5B)モデルの場合、わずか5GBのVRAMでGRPOトレーニングが可能です。

GRPOについては下記もご覧ください

https://qiita.com/yonaka15/items/c54aa8dd586176a8c120

## 実用例: どんな場面で使えるか

Unslothは以下のような場面で特に有用です：

1. **限られたGPUリソースでのファインチューニング**: 高価なクラウドGPUを使わなくても、比較的小さなGPUでLlamaやMistralなどの大規模モデルをファインチューニングできます。

2. **長いコンテキスト対応モデルの開発**: Unslothは長いコンテキスト（数万トークン）でのファインチューニングをサポートしており、長文理解や長期記憶が必要なアプリケーションの開発に役立ちます。

3. **特定ドメインへの適応**: 医療、法律、金融など特定分野の専門知識をモデルに学習させる際に、効率的にファインチューニングを行えます。

4. **推論能力の向上**: GRPOを使って、複雑な問題解決や論理的推論が求められるタスクにモデルを最適化できます。

## macOSでの利用について

現時点（2025年2月）では、Unslothは**macOS（Apple Silicon）で直接利用することはできません**。Unslothは主にCUDAを利用するNVIDIA GPUをターゲットに設計されており、Apple SiliconのGPU（Metal）では動作しません。

### Apple Siliconユーザーのための代替手段

1. **MLXを利用する方法**：Apple自身が開発したMLXフレームワークを使用すると、Apple Silicon上でLLMのファインチューニングが可能です。MLXはApple Silicon向けに最適化されています。
   ```bash
   pip install mlx mlx_lm transformers datasets
   ```

2. **Google Colabを利用する**：リモートのGPUを使ってファインチューニングを行う方法です。Unslothが提供する無料のColabノートブックを活用できます。ファインチューニング後のモデルはollamaなどでmacOSでも動作可能です。

3. **クラウドGPUサービスの利用**：AWS、GCP、Azureなどのクラウドサービスでgpuインスタンスを起動して実行する方法もあります。


### 将来の展望

Unslothのリポジトリでは、Apple Siliconのサポートに関するプルリクエスト（PR #1289）が進行中です。この開発により、将来的にはmacOSのApple Silicon上でもUnslothを使用できる可能性があります。現在の実装はまだ最適化されておらず、以下の制限があります：

- 未最適化状態
- GGUFサポートなし
- 特別なインストール手順が必要

## まとめ

Unslothは、大規模言語モデルのファインチューニングを民主化する素晴らしいツールです。2倍の速度向上と70%以上のメモリ削減により、より多くの開発者や研究者が最新のLLMをカスタマイズできるようになりました。

特に注目すべき点は：

- 様々な最新モデル（Llama 3.3、Phi-4、Mistral v0.3など）をサポート
- 高精度を維持しながら効率化（近似手法を使わない）
- 無料で使えるColabノートブック
- 継続的な機能追加と改善（GRPOのサポート、Dynamic 4-bit量子化など）

現時点ではNVIDIA GPUを搭載したマシンでの利用が前提ですが、Apple SiliconユーザーはMLXフレームワークやクラウドGPUサービスなどの代替手段を活用することができます。将来的にはApple Siliconのサポートも期待されています。

もし大規模言語モデルのファインチューニングに興味があれば、Unslothは間違いなく試してみる価値があるツールだと感じました。DeepSeekの登場以降、ローカルでLLMを動作させることも現実味を帯びてきています。今回のGRPOサポートはそれを実現する強力な手段になるでしょう。

特に注目すべきは、Unslothでファインチューニングしたモデルがローカル環境でも使いやすいように設計されている点です。Ollama、llama.cpp、LM Studioなどのローカルでの推論に使用されるツールとの互換性を考慮し、GGUF形式へのエクスポートをサポートしています。つまり、クラウドのGPUリソースを使ってファインチューニングした後、自分のPCで実際に使用するという柔軟な運用が可能です。

限られたリソースでも、最先端のAI技術を活用できる可能性を広げてくれるUnslothは、LLMの民主化に大きく貢献する技術だと思います。

## 参考リンク

- [Unsloth GitHub リポジトリ](https://github.com/unslothai/unsloth)
- [Unsloth 公式ドキュメント](https://docs.unsloth.ai/)
- [Unsloth Colabノートブック一覧](https://docs.unsloth.ai/get-started/unsloth-notebooks)
- [Apple Silicon向けMLXフレームワーク](https://github.com/ml-explore/mlx)
- [MLXを使用したApple Silicon上でのファインチューニングガイド](https://medium.com/tutorial-by-winston-wang/beginners-guide-to-fine-tuning-models-using-mlx-on-apple-silicon-1a21ebb70aed)