AI初心者がローカルで動かして遊ぶLLM
イントロ
AI初心者です!
最近はDeepSeek-R1の一件でLLMの情報が沢山目に入るようになりました。ローカルで動かせるものもあるのかと調べて試してみると、個人レベルでも思ったより高品質なLLMが動かせたので、最終的にMac mini M4モデルをLLM専用機として設けました。今回のポストではその経緯や試したLLMについて紹介したいと思います。
AI初心者としての経験
以前Tensorflowが出現したタイミングでは、NVIDIA GeForce GTX9xxか1xxxあたりのグラフィックボードでTensorflowのモデル学習プログラムを試したことがありました。テクノロジーに関する知識がないままあれこれ試しましたが、日本語が出力できる何かにはなったものの、意味を成す文章は生成できませんでした。
ゲーミングPCで試す
そして現在、ゲーミングPCとして使っているマシンには占有VRAMが8GBあるのですが(RTX 3070 Ti)、これで何か動かせないかと調べてみました。
最初に行きついたのはw64devkitとllama.cppのllama-serverでした。これで当初の目的としていたDeepSeek-R1がローカルで動かせました。ちなみに 60 token/sec以上の早さで快適に動いたのは8BパラメータのQ6_K_L量子化モデルあたりでした。それ以上になるとVRAMに乗り切らず、実行速度が一気に落ち込んだと思います。
そして一度満足に動かせるものが見つかると、そこから更に調べて同じくらいのサイズのモデルが他にもたくさんあることを知り、いろいろ試したくなりました。
またllama-serverの代わりに、OllamaとOpen WebUIの組み合わせで、簡単に複数のモデルを切り替えて試せるということも知りました。
NVIDIAのJetsonが入手できず
実際にローカルでもどれだけLLMを動かせるものなのかと知ると、もっと使い倒したいもっと勉強したい思い、専用のサーバを用意したくなります。
新しく発売予定のNVIDIAのグラフィックボードRTX 5xxxは価格がとんでもなく高く、即座に検討リストから落としました。
次に思いついたのは同じくNVIDIAよりJetsonです。しかし残念ながらJetson Orin Nano Developer Kitは売り切れで購入できませんでした。発売当初は公式販売代理店より4万円台で購入できたのでしょうか、うらやましいです。
Mac Mini M4をLLM専用機に
Appleシリコンでは、メモリはVRAMも何もかもUnified Memoryとして共通で扱われると見聞きしました。メモリの大きなMac miniを用意すればゲーミングPCより大きなLLMが動かせると思い、早速32GBメモリのMac mini M4を購入しました。
準備
初期起動時のウェルカム画面、セットアッププロセスを済ませ、sshアクセスを有効にします。これだけ済ませれば、ディスプレイもキーボード、マウスも全て外し、おうちラボにある他のヘッドレスサーバの仲間入りです。
あとはリモートでbrewをインストールしたり、LLMを動かす準備を進めていきます。
ちなみに初期セットアップですが、Siriや位置情報などいろいろオフにしなくてはと思っていたものが軒並みデフォルトでオフになっていたことに感心しました。プラットフォームに応じて初期設定が異なっているのでしょうか。
Ollamaの用意
Ollamaはbrewでインストールできます。インストール後はモデルの用意などは後回しに、とりあえず立ち上げてしまいましょう。
直接ollama serve
としても、sudo brew services start ollama
でも大丈夫です。
なお以下のコマンド例のうち、HOMEの指定は必要ですがOLLAMA_HOSTはなくても大丈夫です。Ollamaのサービスは次に準備するOpen WebUI経由で利用できるのですが、私はOllamaも直接APIでも試したかったので0.0.0.0でリッスンするようにしています。
### ollama serve
# to execute and see logs in foreground
# ctrl+c to stop
OLLAMA_HOST=0.0.0.0 HOME=/Users/$USER ollama serve
# to run in background
OLLAMA_HOST=0.0.0.0 HOME=/Users/$USER nohup ollama serve &
# find the process ID and kill it to stop
# ps aux | grep -i ollama
# kill {ID of the process running "ollama serve"}
### OR, brew services to start and stop ollama
sudo brew services start ollama
sudo brew services stop ollama
後者、brew services
で動かす場合ですが、変数はproperty listファイル、/opt/homebrew/Cellar/ollama/{OLLAMA_VERSION}/homebrew.mxcl.ollama.plist
内で設定できます。<plist><dict> ... </dict></plist>
にいろいろキーがあると思いますが、EnvironmentVariables
という名称でキーを追加しましょう。
<key>EnvironmentVariables</key>
<dict>
<key>HOME</key>
<string>/Users/YOUR_USERNAME_HERE/</string>
<key>OLLAMA_HOST</key>
<string>0.0.0.0:11434</string>
</dict>
Open WebUIセットアップ
Open WebUIはpythonのパッケージマネージャであるuvを使って起動することにします。こちらもフォアグランドで実行されてしまいますので、少しコマンドを追加してバックグラウンド実行で起動すると便利です。
https://docs.openwebui.com/getting-started/quick-start/#installation-with-uv
# install uv
curl -LsSf https://astral.sh/uv/install.sh | sh
# run open-webui
DATA_DIR=~/.open-webui uvx --python 3.11 open-webui@latest serve
# use nohup & to run this in background
DATA_DIR=/Users/$USER/.open-webui nohup /Users/$USER/.local/bin/uvx --python 3.11 open-webui@latest serve &
# find the PID and kill it to stop open-webui
すると8080ポートへウェブブラウザでアクセスすることでOpen WebUIが利用できます。初回ログイン時にユーザ名やパスワードが設定できます。
なおTLSオフロードやMFAサービスと連動させているリバースプロキシなどを用意すれば、比較的安心して外出時もインターネット経由で使えるようにできるのでおすすめです。私はnginxとautheliaで構築しています。今回のポストではこれらの詳細は省きます。
Ollamaライブラリにあるモデルを試す
Open WebUIでは利用するモデルがUI上のプルダウンより選択してプロンプトを投げられます。初期設定のままですでにOllamaと連携しているので、モデルに関してはOpen WebUIもOllamaも起動している状態のまま、コマンドライン操作で使用モデルが追加できます。
モデルに関してはOllamaのモデルライブラリ上で好きなものを見つけ、ollama pull
コマンドでダウンロードし使用可能状態にできます。
# pull Google gemma2
ollama pull gemma2:9b
# list available models
ollama ls
ちなみに32GBメモリのMac mini M4モデルで特にカスタマイズせず快適に試せたモデルを参考までにリストします。RTX 3070 Tiで厳しかったものも動きました。
Ollamaのウェブサイトでどれも特徴などが確認できますので見てみてください。こんなに多種多様なモデルが公開されていて自由に試せるのは素晴らしいですね。
- 汎用目的にはこれらのモデル:
- llama3.2:3b
- mistral-nemo:12b
- gemma2:9b
- gemma2:27b
- hermes3:8b
- phi4:14b
- granite3.2:8b
- 計算に関することにはこのモデル:
- deepscaler:1.5b
- コーディング用にはこれらのモデル:
- codegemma:7b
- codellama:13b
- granite-code:8b
- granite-code:20b
- リーズニングモデルとしてはこれら:
- deepseek-r1:7b
- deepseek-r1:8b
- deepseek-r1:14b
- openthinker:7b
モデルの概要を見てみる
LLMを動かしている際、ollama ps
コマンドでプロセッサ利用率が確認できます。GPUおよびVRAMで扱いきれないモデルを動かしている際は、ここで"10% CPU 90% GPU"など使用割合が確認できます。
ご自身のマシンのリソースでどこまでGPU側だけで扱えるのか、いろいろなサイズのモデルを試して確認できます。
% ollama ps
NAME ID SIZE PROCESSOR UNTIL
gemma2:9b ff02c3702f32 9.5 GB 100% GPU 4 minutes from now
また、ollama show
コマンドでモデルの概要が確認できます。
% ollama show gemma2:9b
Model
architecture gemma2
parameters 9.2B
context length 8192
embedding length 3584
quantization Q4_0
Parameters
stop "<start_of_turn>"
stop "<end_of_turn>"
License
Gemma Terms of Use
Last modified: February 21, 2024
huggingfaceのGGUFモデルをollamaで動かす - gemma2 9B
以上で触れたのはすべてOllamaからダウンロードできたものでしたが、他のサイトで公開されているモデルも利用可能です。
探す、ダウンロードする、Ollama上で使えるようにするの3ステップで簡単に利用できるものではGGUF形式のモデルがありますので、gemma2の例で少し紹介させてください。
先に確認した通り、ollama pull gemma2:9b
でOllamaのライブラリから引っ張ってこられるものは"Q4_0"という量子化タイプであることがわかります。
Huggingface上の、例えばhttps://huggingface.co/models?other=base_model:quantized:google/gemma-2-9b-itより確認できるレポジトリでは"Q4_0"以外の量子化タイプのものも公開されているのが見つけられます。
マシン性能が許すならより大きいサイズのモデルの方が良いのだろうかという考えで以下の通り別量子化タイプのモデルを用意してみました。
# prepare a directory to store gguf and Modelfile files
# download gguf file
curl -LO https://huggingface.co/bartowski/gemma-2-9b-it-GGUF/resolve/main/gemma-2-9b-it-Q6_K_L.gguf
# prepare Modelfile
echo "FROM gemma-2-9b-it-Q6_K_L.gguf" > Modelfile
# prepare it as ollama model
ollama create gemma2-it-q6kl:9b
# you can delete the downloaded gguf file to spare disk space once "ollama create'd"
そうして用意できたモデルはこちらです。"quantization"が異なっていることが確認できます。
% ollama show gemma2-it-q6kl:9b
Model
architecture gemma2
parameters 9.2B
context length 8192
embedding length 3584
quantization Q6_K
Parameters
stop "<start_of_turn>"
stop "<end_of_turn>"
Ollamaのモデルライブラリ以外でも利用できるものがあるという簡単な紹介でした。
gemma2 27Bモデル
ちなみにgemma2の27BのモデルもMac miniでサクサク動きました。
% ollama ps
NAME ID SIZE PROCESSOR UNTIL
gemma2:27b 03a966a88963 21 GB 100% GPU 4 minutes from now
% ollama show gemma2:27b
Model
architecture gemma2
parameters 27.2B
context length 8192
embedding length 4608
quantization Q5_K_M
Parameters
stop "<start_of_turn>"
stop "<end_of_turn>"
終わりに
以上です!個人でこれだけ使えるようになるとすごくLLMが身近に感じられるようになりました。自分でもローカル環境で試してみようか検討している方の参考になれば幸いです。
Ollamaは手軽ですし、Open WebUIはローカルのOllamaだけでなく、企業がホスティングしているLLMも利用するためのインタフェースとして使えますし、ドキュメント・knowledge baseのアップロードしてそれを参照させる(RAG)、ファンクションやフィルタやパイプ、Text-to-Speechなどなど多機能で、またプログラムを組んでAPI越しに利用するといったこともできます。
いろいろ試して楽しんで、自分なりの活用方法を見つけていきたいと思います。
dLLM
最後の最後にもう一点。
Diffusion LLM (dLLM)はinceptionが公開しているものを試してみましたがものすごいスピードですね。そのうちOllamaなり、何かローカルで実行できるものも登場するのでしょうか、楽しみです!
Discussion
Gemma2を例に挙げて記事を書いたら、投稿日にGemma3が発表されました。こちらもMac mini M4 32GBメモリで動きました。Multi-modalということで活用の幅が広がります。