Mac mini で ローカルLLM： Google の Gemma 3（量子化された MLX版 2種）の画像入力を MLX-VLM で試す

## はじめに

今回の内容は、以下の記事を書いた時に試した「Gemma 3（MLX版、2種）を使ったローカルLLM」のお試しの続きみたいな内容です。

- [Mac mini で ローカルLLM： Google の Gemma 3（MLX版 12B 8bit）を MLX LM で試す - Qiita](https://qiita.com/youtoy/items/43e0c2a5c966963edcc5)
- [Mac mini で ローカルLLM： Google の Gemma 3（MLX版 27B 3bit）を MLX LM ＋ コマンドライン／Python で試す - Qiita](https://qiita.com/youtoy/items/a97b007d25c749a7ae2d)

### 今回の内容

上記と今回の内容が異なる部分は、今回は入力をテキストだけでなく画像も用いる点です。

マルチモーダル対応で、画像入力可能なモデルを使ったローカルLLM では、以前以下の内容を試していたことがありました。

●「Qwen2.5-VL」の量子化された MLX版のモデル（7B 8bit）と「MLX-VLM」を使ったローカルLLM（Image to Text、M4 Mac mini を利用） - Qiita
　https://qiita.com/youtoy/items/98d8b6c8d74c291ba3ca

この「Qwen2.5-VL」を試した時に使った「[MLX-VLM](https://github.com/Blaizzy/mlx-vlm)」と、Gemma 3 を組み合わせて試します。


## 実際に試してみる

### MLX-VLM と Gemma 3 を組み合わせて試す方法

MLX-VLM と Gemma 3 を組み合わせて試す方法について、今回使う以下のモデルのページ（Hugging Face上のもの）を見てみます。

●mlx-community/gemma-3-27b-it-qat-3bit · Hugging Face
　https://huggingface.co/mlx-community/gemma-3-27b-it-qat-3bit

●mlx-community/gemma-3-12b-it-qat-8bit · Hugging Face
　https://huggingface.co/mlx-community/gemma-3-12b-it-qat-8bit

どちらも上記のページ上では、MLX-VLM と組み合わせた例が掲載されています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/7f88c20a-3b0f-4c6a-8da0-ac96a86eb28e.png)

MLX-VLM のアップデート（またはインストール）のコマンドと、MLX-VLM を使った処理を行うコマンドは以下となるようです。

```zsh
pip install -U mlx-vlm
python -m mlx_vlm.generate --model mlx-community/gemma-3-27b-it-qat-3bit --max-tokens 100 --temperature 0.0 --prompt "Describe this image." --image <path_to_image>
```


### 試す環境

今回の内容を試す環境について、ここで情報を少し書いておきます。

- PC
   - M4 の Mac mini（メモリ 24GB、うち 16GB をローカルLLM用で利用可能）
- モデル
   - gemma-3-27b-it-qat-3bit
   - gemma-3-12b-it-qat-8bit
- 実行環境
   - Python の仮想環境で MLX-VLM を利用
- 入力に使う画像
   - ![2025-05-03_17-06-41.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/3be9517d-b636-4d16-a0be-b60922a70704.jpeg)



### 画像入力を試す

Gemma 3 での画像入力を試します。


#### gemma-3-27b-it-qat-3bit

まずは「gemma-3-27b-it-qat-3bit」のほうを使って試します。


以下が処理を実行するためのコマンドです。

```zsh
python -m mlx_vlm.generate --model mlx-community/gemma-3-27b-it-qat-3bit --max-tokens 100 --temp 0.0 --prompt "この画像について日本語で説明して" --image "dragon.jpg"
```

そして上記のコマンドを実行したところ、以下の出力が得られました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/1d642e3c-4a22-4419-a57d-0a69788f57d3.png)

プロンプトの部分が文字化けしていたりしますが、出力は画像の内容を説明した日本語を得られました。



#### gemma-3-12b-it-qat-8bit


次に「gemma-3-12b-it-qat-8bit」のほうで試します。


以下が処理を実行するためのコマンドです。

```zsh
python -m mlx_vlm.generate --model mlx-community/gemma-3-12b-it-qat-8bit --max-tokens 100 --temp 0.0 --prompt "この画像について日本語で説明して" --image "dragon.jpg"
```

以下が実行結果です。
今回は先ほどと異なり、出力が英語になってしまいました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/deaeebca-edc2-4cd4-b71b-1f34d3396dbd.png)


再度、同じコマンドを実行したところ、その際も出力が英語になってしまいました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/829e66d2-60c7-4950-a577-bb86bdcaef5c.png)


ここで「プロンプトを英語で書き、その中で日本語での出力を指定する」というやり方も試してみました。以下が実行したコマンドです。

```zsh
python -m mlx_vlm.generate --model mlx-community/gemma-3-12b-it-qat-8bit --max-tokens 100 --temp 0.0 --prompt "Describe this image in Japanese" --image "dragon.jpg"
```

そして以下が出力結果ですが、最終出力の部分は日本語になりました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/547e1733-f578-4350-a49b-936ad37ff125.png)


今回は試行回数が少ないので、上記が偶然そうなったのか、プロンプトを変えた効果なのかは判断しづらい状態だと思います。

そのため、プロンプトを変えたものなどを色々試していければと思います。