Mac mini で ローカルLLM： Google の Gemma 3（MLX版 12B 8bit）を MLX LM で試す

## はじめに
以前も試して記事を書いたり、また記事には書いてないものでもちょこちょこ試しているローカルLLM の話です。

M4 の Mac mini で、以下の「[MLX LM](https://github.com/ml-explore/mlx-lm)」と MLX版のモデルを組み合わせて試していきます。

●mlx-lm · PyPI
　https://pypi.org/project/mlx-lm/

![2025-03-20_02-03-46.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/9b8b4dce-43e3-40e9-b05d-ab9a2df50048.jpeg)

### 過去の記事
MLX LM と MLX版のモデルの組み合わせを過去に試したもので、記事化したものは以下があります。

●mlx-community の「Llama-3-ELYZA-JP-8B-8bit」「Swallow-13b-instruct-v0.1-8bit」を mlx-lm で試す - Qiita
　https://qiita.com/youtoy/items/973910dada605ab7e259

●MLX でローカルLLM：「mlx-community/phi-4-4bit」を試す（M4 Mac mini、mlx-lm を利用） - Qiita
　https://qiita.com/youtoy/items/a12ee071dd8290fc0715

### 今回試すモデル

今回試すモデルは、Googleさんの「Gemma 3（MLX版）」です。

Hugging Face のモデルのメニューで「mlx-community/gemma-3」をキーワードとして検索すると、パラメータ違いのモデルがたくさん出てきます。

●Models - Hugging Face
　https://huggingface.co/models?sort=trending&search=mlx-community%2Fgemma-3

![2025-03-20_02-00-27.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/8d3d00e6-2a70-46f8-a993-b82ec055fedc.jpeg)

この中で、自分の M4 の Mac mini で動かせるモデルを選んでいきます。

#### モデルを選ぶ

自分のマシンはメモリ 24GB で、[設定変更](https://github.com/ml-explore/mlx-lm?tab=readme-ov-file#large-models)を行わない場合はそのうちの 16GB をローカルLLM用に使えます。

その範囲で扱える、できるだけ大きいモデルを選んでみます。

ざっと見ていくと、以下が良さそうに思えました。
（パラメータ数の大きいものから見ていったところ、27B のモデルは量子化されたものでもサイズが厳しそうだったので、12B の量子化されたものを選んだ形です）

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

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

![2025-03-20_02-07-35.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/e34ede4d-e0ef-4849-a14c-5465948fa3ce.jpeg)

ちなみに、「it」と「pt」という種類があるようでしたが、以下の記事に書かれているような違いがあるようです。

●Google の Gemma 3 を解説して試してみる
　https://zenn.dev/schroneko/articles/try-google-gemma-3

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/a51762c4-be22-4319-b84e-b099cc9bc922.png)

今回は「[mlx-community/gemma-3-12b-it-8bit](https://huggingface.co/mlx-community/gemma-3-12b-it-8bit/tree/main)」のほうを使うことにしました。


## 実際に試す

実際に試していきます。

### 下準備

過去の記事と同様に、仮想環境を使います。
既に「myenv」という名前で作成していた環境を使います。

まずはアクティベートです。

```zsh
source myenv/bin/activate
```

過去に MLX LM を試した環境なので、それが導入済みではあるのですが、最新版にアップデートしておくために以下を実行しました。

```zsh
pip install -U mlx-lm
```

### コマンドで利用

下準備はできたので、「[mlx-community/gemma-3-12b-it-8bit](https://huggingface.co/mlx-community/gemma-3-12b-it-8bit/tree/main)」をコマンドで扱います。

#### コマンドの内容

具体的には、以下のコマンドで実行すれば OK です。

```zsh
mlx_lm.generate --model mlx-community/gemma-3-12b-it-8bit --prompt "【プロンプト】"
```

以下のように「--max-tokens」のオプションを併用すると良いかもしれません（デフォルトの値だと、最大トークン数があまり大きくない感じがします）。

```zsh
mlx_lm.generate --model mlx-community/gemma-3-12b-it-8bit --prompt "【プロンプト】" --max-tokens 【数字】
```

ちなみに利用可能なオプションについては、`mlx_lm.generate --help` を実行することで確認できます。
以下はその実行例です（この部分の下に、個々のオプションの説明も出てきています）。

![2025-03-20_02-28-25.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/185b7c62-037b-42ca-b647-22608a008a93.jpeg)


#### 実行結果

コマンドを実行して試した例を掲載します。

![2025-03-20_02-33-06.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/6925572c-6696-45e9-84c8-2ca2a0104444.jpeg)

メモリ利用のピークは 13.688 GB で、生成スピードは 7.962 tokens-per-sec となりました。