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.

当社のツールで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ビット指示用

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

🖥️ Gemma 3nの実行

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

circle-info

我々は 問題を修正しました GGUFがOllamaで正しく動作しない問題を修正しました。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. curl -fsSL https://ollama.com/install.sh | sh モデルを実行してください!失敗した場合は別のターミナルでollama serve を呼び出すことができます!私たちはすべての修正と推奨パラメータ(temperatureなど)を params

📖 チュートリアル: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.cppGitHubで入手してください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に類似しています。 ollama run

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

  1. モデルを実行してください。

  2. 編集 次の --threads 32 --ctx-size 32768 コンテキスト長のため(Gemma 3は32Kのコンテキスト長をサポートします!) --n-gpu-layers 99 --n-gpu-layers 2

  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 GPUを備えたColabノートブックでも動作します!全体として、UnslothはGemma 3nのトレーニングを1.5倍速くし、VRAMを50%削減し、コンテキスト長を4倍にします。

当社の無料Gemma 3n Colabノートブックはデフォルトでテキスト層の微調整を行います。ビジョンやオーディオ層も微調整したい場合は、はるかに多くのVRAMが必要になることに注意してください — 無料の15GBのColabやKaggleの範囲を超える可能性があります。あなたは できます 依然としてオーディオとビジョンを含むすべての層を微調整できますし、Unslothはビジョンだけのように特定の領域だけを微調整することも可能です。必要に応じて次のように調整してください:

🏆ボーナスコンテンツ

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

circle-info

Kaggleが好きなら、GoogleはGemma 3nとUnslothで微調整された最良のモデルに1万ドルの賞金を授与するコンペティションを開催しています! 詳細はこちら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の何が特別なのでしょうか?それは Matryoshka Transformer(MatFormer)arrow-up-right アーキテクチャに基づいており、各トランスフォーマーレイヤー/ブロックが段階的に小さくなるFFNを埋め込み(ネスト)することを意味します。入れ子になった段階的に小さなカップのように考えてください。訓練は、推論時に望むサイズを選んで大きなモデルの性能を最大限に活用できるように行われます。

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

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

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

circle-info

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

最終更新

役に立ちましたか?