はじめに
今回の内容は、過去に M4 の Mac mini を使って試してきたローカルLLM でやっていた内容と似た話です。
M4 の Mac mini でのローカルLLM では、MLX版のモデルを使ったり、Ollama を使ったローカルLLM を試したりしてきました(それで色々と Qiita の記事も書いており、例えば以下の記事などがあります)。
今回の内容
今回はそれと同様のことを、最近入手した M4 の MacBook Air で試してみた話です。
その際、モデルは Gemma 3n を使いました。
これまで試した内容との違い
これまで M4 の Mac mini でのローカルLLM を試してきた時、モデル選びでサイズが 16GB以内のものを探していました。これは、その Mac mini のユニファイドメモリが 24GB で、そのうちローカルLLM のモデル用に使えるのが 16GB になると想定されるためです(8GB は OS用にとられる感じのようで、これまで実験的に試した中で 16GB を超えるサイズのモデルは動かせませんでした)。
一方、最近入手した M4 の MacBook Air のユニファイドメモリは 16GB です。
上記と違って、ローカルLLM のモデル用に使えるメモリは 8GB になる想定であるため、モデル選びの際にサイズが 8GB以内のものを探してみました。また、念のため 8GB を超えるモデルも試してみたのですが、結論から言うとそれも動作させることができました。
(このあたりの詳細は、別途、調べてみようと思います)
さっそく試す
さっそく試していきます。まずは Ollama です。
Ollama で試す
以下から Mac用の Ollama をダウンロードします。
●Download Ollama on macOS
https://ollama.com/download
そして、Gemma 3n のモデルを以下から選びます。
●gemma3n
https://ollama.com/library/gemma3n
どれも 8GB未満のサイズなので、どれを選んでも十分な動作をさせられそうです。
gemma3n:e4b で試す
とりあえず「gemma3n:e4b」を使うことにします。
試すためのコマンドは以下のとおりです。
ollama run gemma3n:e4b
これを実行してから「あなたは誰?」という適当なプロンプトを入力してみた結果、以下のように無事に返答を得ることができました。
MLX-VLM での画像入力を試す
次は MLX-VLM を使った画像入力のお試しです。入力画像は以下で、過去の M4 の Mac mini で使ったものと同じです。
MLX-VLM のセットアップは、以下の過去記事をご覧ください。
それについて 1点、Python の 3.13系を使って試したら途中でエラーが出たので 3.12系を使うようにしていましたが、今回は 3.13系で問題なく動作させられました。
【余談】 Python のバージョン管理
その際用いた Python は以下の記事で書いた mise を使って導入したものです(以前は pyenv を使っていましたが、新しい MacBook Air では mise を使ってみています)。
●mise(ミーズ、旧rtx)で Node.js・Python のバージョンを管理する【Mac での利用】 - Qiita
https://qiita.com/youtoy/items/f53494806013f0d3f51e
gemma-3n-E4B-it-6bit で試す
MLX-VLM を使ったローカルLLM を gemma-3n-E4B-it-6bit で試します。
●mlx-community/gemma-3n-E4B-it-6bit · Hugging Face
https://huggingface.co/mlx-community/gemma-3n-E4B-it-6bit
試した際のコマンドは以下のとおりです。
python -m mlx_vlm.generate --model mlx-community/gemma-3n-E4B-it-6bit --max-tokens 100 --temp 0.0 --prompt "この画像を日本語で説明して" --image "dragon.jpg"
実行した結果は以下のとおりで、無事に動作しました。
--max-tokens 100 にしてしまっていて、そのために出力が途中で途切れてしまいました。
gemma-3n-E4B-it-8bit で試す
さらに動かない想定で、以下も試してみました。
●mlx-community/gemma-3n-E4B-it-8bit at main
https://huggingface.co/mlx-community/gemma-3n-E4B-it-8bit/tree/main
結論から書くと、以下のように動作させることができました。
python -m mlx_vlm.generate --model mlx-community/gemma-3n-E4B-it-6bit --max-tokens 256 --temp 0.0 --prompt "この画像を日本語で説明して" --image "dragon.jpg"
--max-tokens 256 にしましたが、まだ出力が途中で途切れてしまいました(512 くらいにしておくと良かったかも...)。
上記の出力の最後の部分を見ると Peak memory: 8.843 GB となっていて、8GB を超えるメモリを使えているっぽいように見えます。
これがモデルによるものか、それともマシンの挙動によるものかなど、別途詳細を確認できればと思っています。
【追記】 コマンドの修正
以下のワーニングが出ていたので、その対処について書いておきます。
RuntimeWarning: 'mlx_vlm.generate' found in sys.modules after import of package 'mlx_vlm', but prior to execution of 'mlx_vlm.generate'; this may result in unpredictable behaviour
Callingpython -m mlx_vlm.generate ...directly is deprecated. Usemlx_vlm generateorpython -m mlx_vlm generateinstead.
コマンドを以下のようにすれば良いようでした( mlx_vlm.generate と書いていた部分を mlx_vlm generate にしました)。
python -m mlx_vlm generate --model mlx-community/gemma-3n-E4B-it-8bit --max-tokens 512 --temp 0.0 --prompt "この画像を日本語で説明して" --image "dragon.jpg"
【追記2】 MLX LM でも試してみる
M4 の MacBook Air でのローカルLLM で、 MLX LM + Gemma 3n でも試しました。利用したモデルは「mlx-community/gemma-3n-E4B-it-lm-4bit」です。
Prompt: 22 tokens, 111.587 tokens-per-sec
Generation: 91 tokens, 29.382 tokens-per-sec
Peak memory: 3.938 GB



