# Gemma 3n: 実行とファインチューニングの方法

Google の Gemma 3n マルチモーダルモデルは、画像、音声、動画、テキスト入力を扱います。2B と 4B サイズで利用可能で、テキストおよびマルチモーダルタスクに 140 言語をサポートします。現在、ローカルで実行およびファインチューニングできます **Gemma-3n-E4B** と **E2B** を使ってローカルで [Unsloth](https://github.com/unslothai/unsloth).

> **Unsloth で Gemma 3n をファインチューニングする** [**無料の Colab ノートブック**](https://colab.research.google.com/github/unslothai/notebooks/blob/main/nb/Gemma3N_\(4B\)-Conversational.ipynb)

Gemma 3n は **32K コンテキスト長**、30 秒の音声入力、OCR、自動音声認識（ASR）、およびプロンプト経由の音声翻訳をサポートします。

<a href="#running-gemma-3n" class="button primary">実行チュートリアル</a><a href="#fine-tuning-gemma-3n-with-unsloth" class="button secondary">ファインチューニングチュートリアル</a><a href="#fixes-for-gemma-3n" class="button secondary">修正 + 技術解析</a>

**Unsloth の Gemma 3n（Instruct）アップロードは最適な設定で：**

<table><thead><tr><th width="249">Dynamic 2.0 GGUF（テキストのみ）</th><th width="285">Dynamic 4-bit Instruct（ファインチューニング用）</th><th>16-bit Instruct</th></tr></thead><tbody><tr><td><ul><li><a href="https://huggingface.co/unsloth/gemma-3n-E2B-it-GGUF">2B</a></li><li><a href="https://huggingface.co/unsloth/gemma-3n-E4B-it-GGUF">4B</a></li></ul></td><td><ul><li><a href="https://huggingface.co/unsloth/gemma-3n-E2B-it-unsloth-bnb-4bit">2B</a></li><li><a href="https://huggingface.co/unsloth/gemma-3n-E4B-it-unsloth-bnb-4bit">4B</a></li></ul></td><td><ul><li><a href="https://huggingface.co/unsloth/gemma-3n-E2B-it">2B</a></li><li><a href="https://huggingface.co/unsloth/gemma-3n-E4B-it">4B</a></li></ul></td></tr></tbody></table>

**ベースや他の形式を含む全ての Gemma 3n アップロードは以下で確認できます** [**こちらのコレクション**](https://huggingface.co/collections/unsloth/gemma-3n-685d3874830e49e1c93f9339)**.**

## 🖥️ Gemma 3n の実行

現在 Gemma 3n は **テキスト形式** での推論のみサポートされています。

{% hint style="info" %}
私たちは [問題を修正しました](#fixes-for-gemma-3n) Ollama のみで GGUF が正しく動作しない問題を修正しました。Ollama を使っている場合は再ダウンロードしてください。
{% endhint %}

### :gear: 公式推奨設定

Gemma チームによると、推論の公式推奨設定は：

`temperature = 1.0, top_k = 64, top_p = 0.95, min_p = 0.0`

* Temperature を 1.0 に設定
* Top\_K を 64 に設定
* Min\_P を 0.00 に設定（オプション。ただし 0.01 でも良好に動作します。llama.cpp のデフォルトは 0.1）
* Top\_P を 0.95 に設定
* Repetition Penalty を 1.0 に設定（llama.cpp と transformers では 1.0 は無効化を意味します）
* チャットテンプレート：

  <pre data-overflow="wrap"><code><strong>&#x3C;bos>&#x3C;start_of_turn>user\nHello!&#x3C;end_of_turn>\n&#x3C;start_of_turn>model\nHey there!&#x3C;end_of_turn>\n&#x3C;start_of_turn>user\nWhat is 1+1?&#x3C;end_of_turn>\n&#x3C;start_of_turn>model\n
  </strong></code></pre>
* 〜を使ったチャットテンプレート `\n`改行がレンダリングされたもの（最後を除く）

{% code overflow="wrap" %}

```
<bos><start_of_turn>user
Hello!<end_of_turn>
<start_of_turn>model
Hey there!<end_of_turn>
<start_of_turn>user
What is 1+1?<end_of_turn>
<start_of_turn>model\n
```

{% endcode %}

{% hint style="danger" %}
llama.cpp や他の推論エンジンは自動で \<bos> を追加します - \<bos> を二重に追加しないでください！モデルにプロンプトを与える際は \<bos> を無視すべきです！
{% endhint %}

### :llama: チュートリアル：Ollama で Gemma 3n を実行する方法

{% hint style="success" %}
一部のバグ修正があるため、Gemma 3N のクオンタイズファイルを再ダウンロードするか、Ollama 経由で古いものを削除してください。古いファイルを削除して更新するには以下を実行できます：

```
ollama rm hf.co/unsloth/gemma-3n-E4B-it-GGUF:UD-Q4_K_XL

ollama run hf.co/unsloth/gemma-3n-E4B-it-GGUF:UD-Q4_K_XL
```

{% endhint %}

1. インストール `ollama` をまだ行っていない場合は！

```bash
apt-get update
apt-get install pciutils -y
curl -fsSL https://ollama.com/install.sh | sh
```

2. モデルを実行！失敗した場合は別の端末で `ollama serve`を呼び出せます！私たちはすべての修正と推奨パラメータ（temperature など）を `params` として Hugging Face のアップロードに含めています！

```bash
ollama run hf.co/unsloth/gemma-3n-E4B-it-GGUF:UD-Q4_K_XL
```

### 📖 チュートリアル：llama.cpp で Gemma 3n を実行する方法

{% hint style="info" %}
まずは以下の方々に感謝します [Xuan-Son Nguyen](https://x.com/ngxson) （Hugging Face） [Georgi Gerganov](https://x.com/ggerganov) （llama.cpp チーム）に、Gemma 3N を llama.cpp 上で動作させるための貢献をいただきました！
{% endhint %}

1. 最新の `llama.cpp` を入手してください [GitHub はこちら](https://github.com/ggml-org/llama.cpp)。以下のビルド手順にも従うことができます。変更する箇所： `-DGGML_CUDA=ON` を `-DGGML_CUDA=OFF` に変更してください（GPU がない場合、または CPU 推論のみを行いたい場合）。 **Apple Mac / Metal デバイスでは**、次を設定して `-DGGML_CUDA=OFF` その後通常通り続けてください - Metal サポートはデフォルトで有効です。

```bash
apt-get update
apt-get install pciutils build-essential cmake curl libcurl4-openssl-dev -y
git clone https://github.com/ggml-org/llama.cpp
cmake llama.cpp -B llama.cpp/build \
    -DBUILD_SHARED_LIBS=ON -DGGML_CUDA=ON -DLLAMA_CURL=ON
cmake --build llama.cpp/build --config Release -j --clean-first --target llama-quantize llama-cli llama-gguf-split llama-mtmd-cli
cp llama.cpp/build/bin/llama-* llama.cpp
```

2. 直接モデルを読み込むために `llama.cpp` を使いたい場合、以下のようにできます：（:Q4\_K\_XL）は量子化タイプです。Hugging Face（ポイント 3）からダウンロードすることもできます。これは `ollama run`

```bash
./llama.cpp/llama-cli -hf unsloth/gemma-3n-E4B-it-GGUF:UD-Q4_K_XL -ngl 99 --jinja
```

3. **または** モデルをダウンロードする（次をインストールした後） `pip install huggingface_hub hf_transfer` ）。Q4\_K\_M や他の量子化バージョン（BF16 フル精度など）を選択できます。

```python
# !pip install huggingface_hub hf_transfer
import os
os.environ["HF_HUB_ENABLE_HF_TRANSFER"] = "1"
from huggingface_hub import snapshot_download
snapshot_download(
    repo_id = "unsloth/gemma-3n-E4B-it-GGUF",
    local_dir = "unsloth/gemma-3n-E4B-it-GGUF",
    allow_patterns = ["*UD-Q4_K_XL*", "mmproj-BF16.gguf"], # Q4_K_XL 用
)
```

4. モデルを実行します。
5. 編集 `--threads 32` で CPU スレッド数を指定し、 `--ctx-size 32768` でコンテキスト長を指定します（Gemma 3 は 32K コンテキスト長をサポートします！）。 `--n-gpu-layers 99` は GPU オフロードするレイヤー数です。GPU がメモリ不足になる場合は調整してみてください。CPU のみの推論の場合はこれを削除してください。
6. 会話モードの場合：

```bash
./llama.cpp/llama-cli \
    --model unsloth/gemma-3n-E4B-it-GGUF/gemma-3n-E4B-it-UD-Q4_K_XL.gguf \
    --mmproj unsloth/gemma-3n-E4B-it-GGUF/mmproj-BF16.gguf \
    --ctx-size 32768 \
    --n-gpu-layers 99 \
    --seed 3407 \
    --prio 2 \
    --temp 1.0 \
    --repeat-penalty 1.0 \
    --min-p 0.00 \
    --top-k 64 \
    --top-p 0.95
```

7. Flappy Bird をテストする非会話モードの場合：

```bash
./llama.cpp/llama-cli \
    --model unsloth/gemma-3n-E4B-it-GGUF/gemma-3n-E4B-it-UD-Q4_K_XL.gguf \
    --mmproj unsloth/gemma-3n-E4B-it-GGUF/mmproj-BF16.gguf \
    --ctx-size 32768 \
    --n-gpu-layers 99 \
    --seed 3407 \
    --prio 2 \
    --temp 1.0 \
    --repeat-penalty 1.0 \
    --min-p 0.00 \
    --top-k 64 \
    --top-p 0.95 \
    -no-cnv \
    --prompt "<start_of_turn>user\nCreate a Flappy Bird game in Python. You must include these things:\n1. You must use pygame.\n2. The background color should be randomly chosen and is a light shade. Start with a light blue color.\n3. Pressing SPACE multiple times will accelerate the bird.\n4. The bird's shape should be randomly chosen as a square, circle or triangle. The color should be randomly chosen as a dark color.\n5. Place on the bottom some land colored as dark brown or yellow chosen randomly.\n6. Make a score shown on the top right side. Increment if you pass pipes and don't hit them.\n7. Make randomly spaced pipes with enough space. Color them randomly as dark green or light brown or a dark gray shade.\n8. When you lose, show the best score. Make the text inside the screen. Pressing q or Esc will quit the game. Restarting is pressing SPACE again.\nThe final game should be inside a markdown section in Python. Check your code for errors and fix them before the final markdown section.<end_of_turn>\n<start_of_turn>model\n"
```

{% hint style="danger" %}
Gemma 3N は自動的に \<bos> を追加するので \<bos> を削除することを忘れないでください！
{% endhint %}

## 🦥 Unsloth で Gemma 3n をファインチューニング

Gemma 3n は、 [Gemma 3](https://unsloth.ai/docs/jp/moderu/tutorials/gemma-3-how-to-run-and-fine-tune/..#unsloth-fine-tuning-fixes-for-gemma-3)と同様に、 <mark style="background-color:yellow;">**Colab の Tesla T4 のような Float16 GPU での実行に問題がありました**</mark>。推論やファインチューニングのために Gemma 3n をパッチしないと NaN や無限大が発生します。 [詳細は以下をご覧ください](#infinities-and-nan-gradients-and-activations).

* Gemma 3n-E4B を私たちの [無料の Colab ノートブック](https://colab.research.google.com/github/unslothai/notebooks/blob/main/nb/Gemma3N_\(4B\)-Conversational.ipynb)
* **Audio:** Gemma 3n-E4B を私たちの [**音声専用ノートブック**](https://colab.research.google.com/github/unslothai/notebooks/blob/main/nb/Gemma3N_\(4B\)-Audio.ipynb)
* **Vision**：私たちの [**視覚専用ノートブック**](https://colab.research.google.com/github/unslothai/notebooks/blob/main/nb/Gemma3N_\(4B\)-Vision.ipynb)

また、Gemma 3n の独自のアーキテクチャがビジョンエンコーダ内で隠れ状態を再利用するため、以下に記載するような別の興味深い特異点が [Gradient Checkpointing に関して発生することがわかりました](#gradient-checkpointing-issues)

<mark style="background-color:purple;">**Unsloth は Gemma 3n の推論とトレーニングにおいて float16 マシンで動作する唯一のフレームワークです。**</mark> これは、無料の Tesla T4 GPU を備えた Colab ノートブックでも動作することを意味します！全体として、Unsloth は Gemma 3n のトレーニングを 1.5 倍高速化し、VRAM を 50% 削減し、コンテキスト長を 4 倍にします。

私たちの無料の Gemma 3n Colab ノートブックはデフォルトでテキスト層のファインチューニングになっています。ビジョンや音声の層もファインチューニングしたい場合、必要な VRAM が大幅に増えることに注意してください — 無料の Colab や Kaggle が提供する 15GB を超える可能性があります。あなたは *まだ* すべての層（音声と視覚を含む）をファインチューニングすることもできますし、Unsloth を使えば視覚だけのように特定の領域だけをファインチューニングすることも可能です。必要に応じて単に調整してください：

```python
model = FastVisionModel.get_peft_model(
    model,
    finetune_vision_layers     = False, # ビジョン層をファインチューニングしない場合は False
    finetune_language_layers   = True,  # 言語層をファインチューニングしない場合は False
    finetune_attention_modules = True,  # 注意モジュールをファインチューニングしない場合は False
    finetune_mlp_modules       = True,  # MLP 層をファインチューニングしない場合は False
)
```

#### :trophy:ボーナスコンテンツ

皆さんからの要望で <mark style="background-color:blue;">**Gemma 3（4B）用のビジョンノートブック**</mark> を用意しました：

* 私たちのを使ってビジョンサポート付きで Gemma 3（4B）をファインチューニングする [無料の Colab ノートブック](https://colab.research.google.com/github/unslothai/notebooks/blob/main/nb/Gemma3_\(4B\)-Vision.ipynb)

{% hint style="info" %}
Kaggle が好きなら、Google が Gemma 3n と Unsloth でファインチューニングされた最良のモデルに 1 万ドルの賞金を授与するコンペティションを開催しています！ [詳細はこちら](https://www.kaggle.com/competitions/google-gemma-3n-hackathon).
{% endhint %}

## 🐛 Gemma 3n の修正

### :sparkles:GGUF の問題と修正

以下の議論に感謝します [Michael](https://github.com/mxyng) （Ollama チーム） [とまた](https://x.com/ngxson) Xuan

1. （Hugging Face）によって、GGUF に関して特に修正が必要だった 2 つの問題がありました： `パラメータ` add\_shared\_kv\_layers `が誤って` float32 `でエンコードされており、これは問題ではないのですが、Ollama 側でデコードがやや複雑になります - 単純に` uint32 [に変更することで問題が解決します。](https://github.com/ggml-org/llama.cpp/pull/14450) この問題に対処するプルリクエスト。
2. （Hugging Face）によって、GGUF に関して特に修正が必要だった 2 つの問題がありました： `per_layer_token_embd` レイヤーは精度が Q8\_0 であるべきです。より低い精度では正常に動作せず、Ollama エンジンでエラーになります — コミュニティの問題を減らすために、すべてのクオンタイズでこれを Q8\_0 にしました — 残念ながらこれにより容量が増えます。
   1. 更新として、 [Matt](https://huggingface.co/unsloth/gemma-3n-E4B-it-GGUF/discussions/4), [が述べたように埋め込みには Q4\_0、Q4\_1、Q5\_0、Q5\_1 も使用でき、私たちは Ollama でも動作することを確認しました！これは再び、より小さい 2、3、4 ビットのクオンタイズがサイズ的に小さく、Q8\_0 を必要としないことを意味します。](https://huggingface.co/WBB2500) 無限大および NaN の勾配や活性化

## :infinity:Gemma 3n は Gemma 3 と同様に FP16 GPU（例えば Colab の Tesla T4）で問題を抱えます。

{% columns %}
{% column %}
以前の Gemma 3 に対する修正は

ここで議論されています [。Gemma 3 では活性化が float16 の最大レンジを超えることがあり、](https://unsloth.ai/docs/jp/moderu/tutorials/gemma-3-how-to-run-and-fine-tune)Gemma 3N はこの活性化の問題は持たないものの、それでも無限大に遭遇することがありました！ **65504.**

**これらの無限大の原因を突き止めるために、Gemma 3N の絶対最大重み値をプロットしたところ、以下のように観察されました：**
{% endcolumn %}

{% column %}

<figure><img src="https://735611837-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FxhOjnexMCB3dmuQFQ2Zq%2Fuploads%2Fgit-blob-3f1aa0661c7919f8ad830fcbdf85a074d6a54bdf%2FGemma%203%20activation.webp?alt=media" alt=""><figcaption></figcaption></figure>
{% endcolumn %}
{% endcolumns %}

緑の十字が Conv2D の畳み込み重みであることがわかります。Conv2D レイヤーの大きさ（振幅）は平均してかなり大きいことが見て取れます。

<figure><img src="https://735611837-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FxhOjnexMCB3dmuQFQ2Zq%2Fuploads%2Fgit-blob-e9b01a20a0a1cfcc41ef47cb29c5188d52d6a79d%2Foutput2.webp?alt=media" alt="" width="563"><figcaption></figcaption></figure>

以下は大きな振幅を持つ Conv2D 重みの表です。我々の仮説は、Conv2D 演算中に大きな重みが乗算および加算され、

残念ながら偶然により float16 の最大レンジ 65504 を超えてしまう、というものです。 **Bfloat16 は問題ありません。最大レンジが 10^38 であるためです。** 名前

| 最大値                                    | msfa.ffn.pw\_proj.conv.weight |
| -------------------------------------- | ----------------------------- |
| Max                                    | 98.000000                     |
| blocks.2.21.attn.key.down\_conv.weight | 37.000000                     |
| blocks.2.32.pw\_exp.conv.weight        | 34.750000                     |
| blocks.2.30.pw\_exp.conv.weight        | 33.750000                     |
| blocks.2.34.pw\_exp.conv.weight        | 33.750000                     |

### :sparkler:無限大への対処法

素朴な解決策は `アップキャストすることです` すべての Conv2D 重みを float32 に（bfloat16 が利用できない場合は）することです。しかしそれでは VRAM 使用量が増えます。これに対処するために、代わりに私たちは `autocast` をオンザフライで使用して重みと入力を float32 にアップキャストし、行列乗算自体の一部として float32 で蓄積を行うようにしているため、重みを恒久的にアップキャストする必要がありません。

{% hint style="success" %}
Unsloth は Gemma 3n の推論とトレーニングを float16 GPU 上で可能にする唯一のフレームワークであり、そのため無料の Tesla T4 を使った Colab ノートブックでも動作します！
{% endhint %}

### :checkered\_flag:勾配チェックポイントの問題

Gemma 3N のビジョンエンコーダーは隠れ状態を再利用するため非常に独特であることがわかりました。残念ながらこれは [Unsloth の勾配チェックポイント](https://unsloth.ai/blog/long-context)の使用を制限します。ビジョンエンコーダーには適用できないため、VRAM 使用量を大幅に削減できた可能性があるにもかかわらず制約があります。

しかし、それでも私たちは **Unsloth の自動コンパイラ** を活用して Gemma 3N を最適化することに成功しました！

### :cactus:ファインチューニング中の大きな損失値

ファインチューニング開始時に損失が非常に大きく（6〜7 程度）なることを興味深く発見しましたが、時間とともに急速に減少します。これには2つの可能性があると考えています：

1. 実装上の問題があるかもしれませんが、推論は動作しているようなのでこれは可能性が低いです。
2. <mark style="background-color:blue;">**マルチモーダルモデルは常にこの挙動を示すようです**</mark> — 我々は Llama 3.2 Vision の損失が 3〜4 から始まり、Pixtral は約 8、Qwen 2.5 VL も約 4 であることを見つけました。Gemma 3N はオーディオも含むため、開始時の損失が増幅される可能性があります。しかしこれは仮説にすぎません。また、Qwen 2.5 VL 72B Instruct を量子化するとパープレキシティが非常に高く約 30 程度になることを確認しましたが、モデル自体は興味深くも正常に動作します。

<figure><img src="https://735611837-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FxhOjnexMCB3dmuQFQ2Zq%2Fuploads%2Fgit-blob-a37a8ce8ff2cfc3873a9f78acee3744c778692dc%2Foutput(3).png?alt=media" alt="" width="375"><figcaption></figcaption></figure>

{% hint style="success" %}
**Unsloth で Gemma 3n をファインチューニングする** [**無料の Colab ノートブック**](https://colab.research.google.com/github/unslothai/notebooks/blob/main/nb/Gemma3N_\(4B\)-Conversational.ipynb)
{% endhint %}

## 🛠️ 技術的分析

### Gemma 3n : MatFormer

では、Gemma 3n の何がそれほど特別なのでしょうか？それは [マトリョーシカトランスフォーマー（MatFormer）](https://arxiv.org/abs/2310.07707) アーキテクチャに基づいており、各トランスフォーマーレイヤ／ブロックが段階的に小さくなる FFN を埋め込み／入れ子にしているという意味です。入れ子にされた徐々に小さなカップを想像してください。訓練は推論時に望むサイズを選んで大きいモデルの性能を最大限引き出せるように行われます。

また、各レイヤの埋め込み（Per Layer Embedding）をキャッシュして推論時のメモリ使用量を削減することもできます。したがって 2B モデル（E2B）は 4B（別名 5.44B）モデルのサブネットワークであり、これは Per Layer Embedding のキャッシングとオーディオ・ビジョンコンポーネントをスキップしてテキストにのみ集中することで実現されます。

MatFormer アーキテクチャは通常、指数的に間隔をあけたサブモデル（つまりサイズが `S`, `S/2、S/4、S/8` など）で訓練されます。訓練時には入力がランダムにこれらのサブブロックのいずれかを通過するようにされ、各サブブロックが等しい学習機会を得ます。利点は、推論時に元のサイズの1/4のモデルが欲しければ、 `S/4` サイズのサブブロックを各レイヤで選べることです。

また、 **ミックスアンドマッチ** を選択して、例えば `S/4` あるレイヤのサブブロックのサイズを、 `S/2` 別のレイヤのサブブロックのサイズを選び、 `S/8` さらに別のレイヤのサブブロックのサイズを選ぶこともできます。実際には、好みがあれば入力自体に基づいて選ぶサブモデルを変更することも可能です。基本的には各レイヤで自分好みの構造を選べるということです。つまり、特定のサイズのモデルを訓練するだけで、より小さいサイズのモデルを指数関数的に多数作り出していることになります。学習が無駄になりません。かなりすごいですね。

<figure><img src="https://735611837-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FxhOjnexMCB3dmuQFQ2Zq%2Fuploads%2Fgit-blob-0f2e2a7a9d652391166798dec37319252b399f8e%2Fimage.png?alt=media" alt="" width="563"><figcaption><p>出典： <a href="https://ai.google.dev/gemma/docs/gemma-3n">Gemma 3n モデル概要</a></p></figcaption></figure>

{% hint style="info" %}
**当社のツールで Gemma 3n のマルチモーダル推論をファインチューンして試してみてください** [**無料の Colab ノートブック**](https://colab.research.google.com/github/unslothai/notebooks/blob/main/nb/Gemma3N_\(4B\)-Conversational.ipynb)
{% endhint %}
