Gemma 3n:実行&ファインチューニング

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

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

当社のツールで 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ビット指示(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 チームから、llama.cpp で Gemma 3N を動作させてくれたことに対してです!

  1. 最新の llama.cppGitHub で入手arrow-up-rightできます。下のビルド手順に従うこともできます。変更してください -DGGML_CUDA=ON から -DGGML_CUDA=OFF GPU がない場合や CPU 推論のみを行いたい場合は。

  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 の独特なアーキテクチャがビジョンエンコーダで隠れ状態を再利用するため、もうひとつ興味深い特性があることがわかりました: 以下に記載するグラディエントチェックポイント

Unsloth は Gemma 3n の推論とトレーニングを float16 マシンで動作させる唯一のフレームワークです。 つまり、無料の Tesla T4 を搭載した 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 でファインチューニングされた最良のモデルに 10,000 ドルの賞金を授与するコンペティションを開催しています! 詳細はこちらarrow-up-right.

🐛 Gemma 3n に関する修正

GGUF の問題と修正

次の方々との議論のおかげで、 Michaelarrow-up-right Ollama チームから、そしてまた、 Xuanarrow-up-right Hugging Face から、GGUF に特に修正が必要だった 2 つの問題がありました:

  1. その add_shared_kv_layers パラメータが誤ってエンコードされていました(場所: float32 )。これは問題ではないのですが、Ollama 側でデコードが少し複雑になります — 単純に uint32 に変更することで問題は解決します。 この問題に対処するプルリクエストarrow-up-right

  2. その per_layer_token_embd レイヤーの埋め込みは Q8_0 の精度であるべきです。これより低い精度では正常に機能せず、Ollama エンジンでエラーになります — コミュニティの問題を減らすために、すべての量子化でこれを Q8_0 にしました — 残念ながらこれにより容量は増加します。

    1. 更新として、 アップデートarrow-up-right, Mattarrow-up-right が言及したように、埋め込みには Q4_0、Q4_1、Q5_0、Q5_1 も使用でき、Ollama でも動作することを確認しました!これは、小さめの 2、3、4 ビットの量子化ファイルがサイズ的により小さく、Q8_0 を必要としないことを意味します!

♾️無限大および NaN の勾配とアクティベーション

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

Gemma 3 に対する以前の修正は ここで議論されています。Gemma 3 ではアクティベーションが float16 の最大範囲を超えることがあり、 65504.

Gemma 3N はこのアクティベーション問題は持ちませんが、それでも無限大に遭遇することがありました!

これらの無限大の原因を突き止めるため、Gemma 3N の重みの絶対最大値をプロットしたところ、以下のことがわかりました:

緑のバツ印は Conv2D の畳み込み重みです。Conv2D レイヤーの大きさが平均的にずっと大きいことが見て取れます。

以下は大きな大きさを持つ Conv2D 重みの表です。我々の仮説は、Conv2D 演算中に大きな重みが掛け合わされて合算され、 結果的に偶然に float16 の最大範囲である 65504 を超えてしまう、ということです。 Bfloat16 は問題ありません。なぜならその最大範囲は 10^38 だからです。

名前
最大値

msfa.ffn.pw_proj.conv.weight

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 の何が特別なのか?それは次に基づいています: マトリョーシカトランスフォーマー、または MatFormerarrow-up-right アーキテクチャで、各トランスフォーマーレイヤー/ブロックが段階的に小さくなる FFN を埋め込み(ネスト)していることを意味します。これは入れ子になった段々小さいカップのように考えてください。トレーニングは、推論時に望むサイズを選べばより大きなモデルの性能を最大限に引き出せるように行われます。

また、レイヤーごとの埋め込み(Per Layer Embedding)があり、推論時のメモリ使用量を減らすためにキャッシュできます。したがって 2B モデル(E2B)は 4B(別名 5.44B)モデル内のサブネットワークであり、これはレイヤーごとの埋め込みのキャッシュと、音声およびビジョンコンポーネントをスキップしてテキストにのみ注力することで実現されます。

MatFormer アーキテクチャは通常、指数的に間隔を空けたサブモデル(すなわち サイズが Age, S/2、S/4、S/8 など)で各レイヤーにおいて訓練されます。トレーニング時には入力がランダムにこれらのサブブロックのいずれかを通過し、各サブブロックが等しく学習する機会を得ます。ここでの利点は、推論時に元のサイズの 1/4 にしたい場合、各レイヤーで S/4 サイズのサブブロックを選べることです。

また、次のことも選択できます: 組み合わせて選ぶ(Mix and Match) 例えば、あるレイヤーでは S/4 サイズのサブブロックを、 S/2 別のレイヤーではそのサブブロックを、そして S/8 さらに別のレイヤーではそのサブブロックを選ぶ、というように。実際には、好みに応じて入力自体に基づいて選択するサブモデルを変更することもできます。基本的には各レイヤーで自分好みの構造を選べるということです。したがって特定のサイズのモデルを一つだけ訓練することで、より小さいサイズの指数的に多数のモデルを生成できます。学習が無駄になりません。なかなか良い仕組みです。

circle-info

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

最終更新

役に立ちましたか?