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

Google の新しい Gemma 3n を Dynamic GGUF で llama.cpp、Ollama、Open WebUI 上でローカル実行し、Unsloth でファインチューニングする方法。

Google の Gemma 3n マルチモーダルモデルは、画像、音声、動画、テキスト入力を扱います。2B と 4B サイズで利用可能で、テキストおよびマルチモーダルタスクに 140 言語をサポートします。現在、ローカルで実行およびファインチューニングできます Gemma-3n-E4BE2B を使ってローカルで Unslotharrow-up-right.

Unsloth で Gemma 3n をファインチューニングする 無料の Colab ノートブックarrow-up-right

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

実行チュートリアルファインチューニングチュートリアル修正 + 技術解析

Unsloth の Gemma 3n(Instruct)アップロードは最適な設定で:

Dynamic 2.0 GGUF(テキストのみ)
Dynamic 4-bit Instruct(ファインチューニング用)
16-bit Instruct

ベースや他の形式を含む全ての Gemma 3n アップロードは以下で確認できます こちらのコレクションarrow-up-right.

🖥️ Gemma 3n の実行

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

circle-info

私たちは 問題を修正しました Ollama のみで GGUF が正しく動作しない問題を修正しました。Ollama を使っている場合は再ダウンロードしてください。

⚙️ 公式推奨設定

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 は無効化を意味します)

  • チャットテンプレート:

    <bos><start_of_turn>user\nHello!<end_of_turn>\n<start_of_turn>model\nHey there!<end_of_turn>\n<start_of_turn>user\nWhat is 1+1?<end_of_turn>\n<start_of_turn>model\n
  • 〜を使ったチャットテンプレート \n改行がレンダリングされたもの(最後を除く)

triangle-exclamation

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

circle-check
  1. インストール ollama をまだ行っていない場合は!

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

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

circle-info

まずは以下の方々に感謝します Xuan-Son Nguyenarrow-up-right (Hugging Face) Georgi Gerganovarrow-up-right (llama.cpp チーム)に、Gemma 3N を llama.cpp 上で動作させるための貢献をいただきました!

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

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

  1. または モデルをダウンロードする(次をインストールした後) pip install huggingface_hub hf_transfer )。Q4_K_M や他の量子化バージョン(BF16 フル精度など)を選択できます。

  1. モデルを実行します。

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

  3. 会話モードの場合:

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

triangle-exclamation

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

Gemma 3n は、 Gemma 3と同様に、 Colab の Tesla T4 のような Float16 GPU での実行に問題がありました。推論やファインチューニングのために Gemma 3n をパッチしないと NaN や無限大が発生します。 詳細は以下をご覧ください.

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

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

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

🏆ボーナスコンテンツ

皆さんからの要望で Gemma 3(4B)用のビジョンノートブック を用意しました:

circle-info

Kaggle が好きなら、Google が Gemma 3n と Unsloth でファインチューニングされた最良のモデルに 1 万ドルの賞金を授与するコンペティションを開催しています! 詳細はこちらarrow-up-right.

🐛 Gemma 3n の修正

GGUF の問題と修正

以下の議論に感謝します Michaelarrow-up-right (Ollama チーム) とまたarrow-up-right Xuan

  1. (Hugging Face)によって、GGUF に関して特に修正が必要だった 2 つの問題がありました: パラメータ add_shared_kv_layers が誤って float32 でエンコードされており、これは問題ではないのですが、Ollama 側でデコードがやや複雑になります - 単純に uint32 に変更することで問題が解決します。arrow-up-right この問題に対処するプルリクエスト。

  2. (Hugging Face)によって、GGUF に関して特に修正が必要だった 2 つの問題がありました: per_layer_token_embd レイヤーは精度が Q8_0 であるべきです。より低い精度では正常に動作せず、Ollama エンジンでエラーになります — コミュニティの問題を減らすために、すべてのクオンタイズでこれを Q8_0 にしました — 残念ながらこれにより容量が増えます。

♾️Gemma 3n は Gemma 3 と同様に FP16 GPU(例えば Colab の Tesla T4)で問題を抱えます。

以前の Gemma 3 に対する修正は

ここで議論されています 。Gemma 3 では活性化が float16 の最大レンジを超えることがあり、Gemma 3N はこの活性化の問題は持たないものの、それでも無限大に遭遇することがありました! 65504.

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

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

以下は大きな振幅を持つ 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

🎇無限大への対処法

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

circle-check

🏁勾配チェックポイントの問題

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

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

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

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

  1. 実装上の問題があるかもしれませんが、推論は動作しているようなのでこれは可能性が低いです。

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

circle-check

🛠️ 技術的分析

Gemma 3n : MatFormer

では、Gemma 3n の何がそれほど特別なのでしょうか?それは マトリョーシカトランスフォーマー(MatFormer)arrow-up-right アーキテクチャに基づいており、各トランスフォーマーレイヤ/ブロックが段階的に小さくなる 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 さらに別のレイヤのサブブロックのサイズを選ぶこともできます。実際には、好みがあれば入力自体に基づいて選ぶサブモデルを変更することも可能です。基本的には各レイヤで自分好みの構造を選べるということです。つまり、特定のサイズのモデルを訓練するだけで、より小さいサイズのモデルを指数関数的に多数作り出していることになります。学習が無駄になりません。かなりすごいですね。

circle-info

当社のツールで Gemma 3n のマルチモーダル推論をファインチューンして試してみてください 無料の Colab ノートブックarrow-up-right

最終更新

役に立ちましたか?