世界を動かす技術を、日本語で。

Show HN: Apple Silicon向けGemma 4マルチモーダルファインチューナー

概要

  • Gemmaモデルのテキスト・画像・音声のローカルファインチューニングをMac上で実現
  • 大容量データもGCSやBigQueryからストリーミング学習が可能
  • Apple Silicon (M1/M2/M3)にネイティブ対応、NVIDIA GPU不要
  • LoRAによるマルチモーダル学習をサポート
  • プライバシー重視のオンデバイストレーニングが可能

Gemma Tuner Multimodalの特徴

  • Gemmaのテキスト・画像・音声ファインチューニング をMac上で実行
    • テキストのみ、画像+テキスト(キャプション/VQA)、音声+テキストの全モード対応
  • ローカルCSV によるデータ管理
    • テキストや画像・音声のペアデータをCSVで管理し、学習・評価を簡単に設定
  • GCS/BigQueryからのストリーミング学習
    • ローカルストレージ不足でも、クラウド上のテラバイト級データに直接アクセス
  • Apple Silicon(MPS)ネイティブ動作
    • NVIDIA GPUやCUDA環境が不要、Mac一台で完結
  • LoRAによる軽量ファインチューニング
    • Hugging FaceのGemmaチェックポイントとPEFT LoRAを活用

他ツールとの比較

  • Gemma 3n/4 のテキスト・画像・音声ファインチューニングに唯一フル対応
  • Apple Siliconでマルチモーダル学習 できる唯一の選択肢
  • クラウドストリーミング学習オンデバイス完結 も実現

| 機能 | gemma-tuner-multimodal | MLX-LM | Unsloth | axolotl | |---|---|---|---|---| | テキストのみLoRA | ✅ | ✅ | ✅ | ✅ | | 画像+テキストLoRA | ✅ | ⚠️ | ⚠️ | ⚠️ | | 音声+テキストLoRA | ✅ | ❌ | ❌ | ⚠️ CUDAのみ | | Apple Silicon対応 | ✅ | ✅ | ❌ | ❌ | | クラウドストリーミング | ✅ | ❌ | ❌ | ⚠️ 部分対応 | | NVIDIA GPU不要 | ✅ | ✅ | ❌ | ❌ |

できること・用途例

  • 専門分野ASR :医療・法律・コールセンターなどの音声認識精度向上
  • ドメイン特化画像理解 :レシート、チャート、製造欠陥、医療画像キャプションやVQA
  • ドキュメント・画面理解 :UIエージェントやOCRパイプライン、チャートQA
  • アクセント・少数言語適応 :独自音声ラベルでGemmaを多言語化
  • マルチモーダルアシスタント :画像・音声とテキスト推論の組み合わせ
  • 完全ローカル学習 :データと重みが外部に出ないプライベート運用

サポートモデル

  • Gemma 3n/4 (テキスト・画像・音声の各種チェックポイント)
  • Hugging FaceのGemmaベースモデルと連携
  • Gemma 4の大規模モデル(26B/31B)は現時点で非対応

アーキテクチャ概要

  • CLIツール :gemma-macos-tuner
    • モデル選択、データセット設定、学習・評価・エクスポートを一元管理
  • データローダー :ローカル/HTTP/GCS/BigQueryからCSVをロード
  • 学習・評価スクリプト :finetune.py、evaluate.py、export.py
  • 設定管理 :INIファイル階層でデフォルト・グループ・モデル・データセット・プロファイルを管理

動作要件

  • Python 3.10以上 (Homebrewやpython.orgからarm64バージョン推奨)
  • macOS 12.3以上 (Apple Silicon/MPS必須)
  • RAM 16GB以上 (小規模なら可、64GB推奨)
  • PyTorch (MPSまたはCUDAビルド)
  • Hugging Faceアカウント (Gemmaモデル利用のため)

インストール手順

  1. 仮想環境作成
    • Homebrewでpython@3.12をインストール
    • python3.12 -m venv .venv && source .venv/bin/activate
  2. arm64確認
    • python -c "import platform; print(platform.machine())" でarm64を確認
  3. PyTorchインストール
    • pip install torch torchaudio
  4. パッケージインストール
    • pip install -e .
  5. Gemma 4利用時
    • pip install -r requirements/requirements-gemma4.txt
  6. Wizard起動
    • gemma-macos-tuner wizard で対話的セットアップ

主要コマンド

  • データセット準備 :gemma-macos-tuner prepare <dataset-profile>
  • 学習 :gemma-macos-tuner finetune <profile> --json-logging
  • 評価 :gemma-macos-tuner evaluate <profile-or-run>
  • エクスポート :gemma-macos-tuner export <run-dir-or-profile>
  • ブラックリスト生成 :gemma-macos-tuner blacklist <profile>
  • セットアップウィザード :gemma-macos-tuner wizard

テキストのみファインチューニング

  • CSVのローカル分割データ で学習
  • instructionモード :prompt_column, text_column指定でユーザー/アシスタント形式
  • completionモード :text_columnのみで全体を学習
  • max_seq_length 指定可能(デフォルト2048)

画像ファインチューニング

  • キャプション (image_sub_mode=caption)または VQA (image_sub_mode=vqa)選択
  • image_token_budget (70, 140, 280, 560, 1120)で画像情報量を調整
  • image_path_column で画像パス指定

音声ファインチューニング

  • 音声+テキストペア のCSVによる学習
  • ASR評価スクリプトクラウドストリーミング も対応

クラウドデータ対応

  • GCS/BigQueryのCSVデータ をローカルにコピーせず直接学習
  • Application Default Credentials でBigQuery認証

Tips & 注意点

  • 長いシーケンス学習時はOOMに注意 (RAM不足に陥りやすい)
  • bf16推奨、MPS安定性のためattentionはeagerモード
  • PYTORCH_ENABLE_MPS_FALLBACK=1 は本番で無効推奨(CPUフォールバックを隠すため)

開発者メッセージ(要約)

  • Whisperのローカルファインチューニング から始まり、Gemma 3n/4に拡張
  • 大容量クラウドデータのストリーミング学習 を実現するために開発
  • Apple Siliconで音声ファインチューニングできる唯一の選択肢
  • 個人のサイドプロジェクト として楽しみながら開発
  • Gemma 4の注目度の高さMLXで音声ファインチューニング不可 が本ツール開発の動機

公式リポジトリ・詳細 https://github.com/mattmireles/gemma-tuner-multimodal

ドキュメント

  • README/guides/README.md
  • README/specifications/Gemma3n.md
  • README/guides/apple-silicon/gemma4-guide.md

コミュニティ貢献・フォーク歓迎

Hackerたちの意見

これやってくれてありがとう!面白そうだね、すぐにチェックしてみるよ。

どういたしまして!楽しいサイドクエストだったよ。

いいね!ローカルオーディオのファインチューニングを試してみたかったんだ。音楽のボーカルにも効くといいな。

M2 Max 96GBでWhisper Large-v3を動かしてるけど、推論だけでも長い音声だとメモリがギリギリになる。ファインチューニングはどんな感じになるのか想像もつかないよ。Gemma 4のファインチューニングで64GBと96GBの違いって、意味あるのかな?それとも単にOOMの壁を少し後ろに押すだけ?Apple Siliconでローカルファインチューニングを試したいけど、ツールのギャップがあって今のところ推論だけなんだ。

メモリの使用量はシーケンスの長さに対して二次的に増加するから、ファインチューニング中は短いシーケンスを使うとメモリの爆発を防げるよ。64GBのRAMのマシンでは、約2,000トークンの入力シーケンスに制限されてる。ファインチューニングタスクの平均出力が約1,000トークンだから、合計で3,000トークンくらいになるね。

今日はこれに取り組んでたんだよね(自分も音声FTで先に進めてたけど、OPには数時間負けちゃった)。音声推論のためには、まずVADを通してゴミデータを取り除くのがいいよ。それを大きなモデルに送る前のいくつかの前処理ステップの一つとして使うといい。やり方はここで確認できるよ: https://github.com/accretional/vad/blob/main/pkg/vad/vad.go 自分は https://huggingface.co/onnx-community/pyannote-segmentation-... を使ってたんだけど、ONNXのおかげでIntelサーバーでベクトル化された命令を使って実行できるし、ローカルのMacでも、ブラウザ上でtransformers.jsでも動かせるんだ。VADはめちゃくちゃ時間効率が良くて(1時間の音声をセグメントするのにO(10s)くらいだと思う)、誤検出率や文字起こし、マルチモーダル推論のコストを減らせるから、セグメント化した小さな音声を別の専門モデルに渡して、テキストにエンコードしてから高価なモデルに渡せるんだ。

Whisper v3についてだけど、どうしてこれが可能なの?Whisperには30秒のコンテキストウィンドウがあるから、チャンクに分けないといけないよね。

これめっちゃクールだね、絶対試してみる!いい仕事だ。

いいね!

Gemma 4が入ったEdge GalleryのiOSアプリにすごくワクワクしてるけど、どうやら制限があるみたいで、インテントにアクセスできないし、ウェブ検索用のカスタムプラグインを書かなきゃいけないんだ。これをうまく使う方法が好きな人いる?ChatMCPは結構うまくいくけど、API経由のモデルしかサポートしてないんだよね。

ちょっとお知らせだけど、NVIDIA Parakeetの方がWhisperより全然良いと思ったよ。速いし、計算資源も少なくて、出力もいいし、出力の選択肢も多い。コマンドラインからparakeet-mlxを使ってるよ。ぜひ試してみて!

そうだね、去年自分のプロジェクトに取り組み始めた後に出たんだ。ただ、Apple Siliconではファインチューニングできないのが問題なんだよね。

MacWhisperでWhisper v3 largeとParakeetの両方を試してみたけど、結局Whisper largeに戻っちゃうんだ。どちらが良いかは、何をディクテーションするか、話し方、使う言語によるよね。

15,000時間の音声データがあったけど、ファインチューニングにはそんなにデータが必要なの?

データが多いほど -> より良く、より速いオンデバイスモデルが作れる。実際の計画は、Gemini 2.5 Proを最高のオンデバイス音声認識モデルにすることだったんだ。うまくいったと思うんだけど、残念ながら。

アクセント、方言、低リソース言語の適応 — 基本のGemmaモデルを、あなた自身のラベル付き音声で過小評価されている声や言語に適応させる。これはTTS用?特定のアクセントを得るためにローカルでファインチューニングできるものを探してたんだけど。