Mac mini で ローカルLLM：「Qwen3-30B-A3B」「Phi-4-reasoning」を MLX LM で試す（量子化された MLX版）

## はじめに

M4 の Mac mini で、MLX版のモデルを使ったローカルLLM を試しているのですが、その流れの 1つです。

過去に試したものの一部は、以下の検索に出てくる記事に書いています。

●「ローカルLLM user:youtoy」の検索結果 - Qiita
　https://qiita.com/search?q=%E3%83%AD%E3%83%BC%E3%82%AB%E3%83%ABLLM%20user%3Ayoutoy&sort=created


今回は、まだ試していない「Qwen3-30B-A3B」「Phi-4-reasoning」を使ってみます。


### 関連する公式のポスト

https://x.com/Alibaba_Qwen/status/1916962087676612998

https://x.com/Azure/status/1917959323822493889



## 実際に試す

### 試す環境

試す環境について、モデル以外のところは[過去にも使った](https://qiita.com/youtoy/items/a97b007d25c749a7ae2d)以下の環境を利用します。

- PC
   - M4 の Mac mini（メモリ 24GB、うち 16GB をローカルLLM用で利用可能）
- モデル
   - [Qwen3-30B-A3B-mixed-3-4bit](https://huggingface.co/mlx-community/Qwen3-30B-A3B-mixed-3-4bit)
   - [Phi-4-reasoning-8bit](https://huggingface.co/mlx-community/Phi-4-reasoning-8bit)
   - [Phi-4-reasoning-plus-8bit](https://huggingface.co/mlx-community/Phi-4-reasoning-plus-8bit)
- 実行環境
   - Python の仮想環境で MLX LM を利用、Python のコードで処理を実行


#### 補足：使ってみるモデル

今回試したモデルについての補足ですが、自分の Mac mini で使えるものを選びました。

Qwen3-30B-A3B は、以下のモデルサイズになるものです。

https://huggingface.co/mlx-community/Qwen3-30B-A3B-mixed-3-4bit/tree/main
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/e14c21a3-32be-4d3d-80d4-11ea7f3b1ee7.png)


また Phi-4-reasoning は、以下です。

https://huggingface.co/mlx-community/Phi-4-reasoning-8bit/tree/main
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/52cb5265-147b-48e0-aee6-c5955cc65d13.png)


https://huggingface.co/mlx-community/Phi-4-reasoning-plus-8bit/tree/main
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/d992c33c-feb7-4988-85fd-a78f067aa9e2.png)


### コマンドラインで試す

#### Phi-4-reasoning

先に Phi-4-reasoning（Phi-4-reasoning-plus-8bit、Phi-4-reasoning-8bit）で試した内容と結果を載せます。


2つのモデルのどちらでも、以下の同じプロンプトで試しました。

```zsh
mlx_lm.generate --model mlx-community/Phi-4-reasoning-plus-8bit --prompt "生成AIを8歳に分かるように短い言葉で説明して" --max-tokens 1024
```

```zsh
mlx_lm.generate --model mlx-community/Phi-4-reasoning-8bit --prompt "生成AIを8歳に分かるように短い言葉で説明して" --max-tokens 1024
```

今回、どちらの場合も <think> の途中で無限ループのような状態になりました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/3ae9ee56-b632-4c2b-9463-da4b63d8ec77.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/5c8f10a5-9e2b-4c52-b674-86ed845bbf0e.png)





#### Qwen3-30B-A3B

Qwen3-30B-A3B（Qwen3-30B-A3B-mixed-3-4bit）で試した内容と結果を示します。

先ほどのものを少し変えた、以下のプロンプトで試しました。

```zsh
mlx_lm.generate --model mlx-community/Qwen3-30B-A3B-mixed-3-4bit --prompt "生成AIを8歳に分かる内容で文章3つ・日本語の文で説明して" --max-tokens 1024
```

```zsh
mlx_lm.generate --model mlx-community/Qwen3-30B-A3B-mixed-3-4bit --prompt "生成AIを8歳に分かる内容で短く説明して" --max-tokens 1024
```


それらを試した時の様子を動画にしてみました。
※ 動画の冒頭、 `<think>` がいきなり表示されていますが、コマンド実行直後からの 3〜4秒くらいをカットしています

<iframe width="560" height="315" src="https://www.youtube.com/embed/H19FRrDthb0?si=rmB64XrYaJnicfpB" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>


直近で試していたモデルと比較すると、かなり出力がはやいです。性能は評価できてないので、それは別途確認できればと思います。