📌

AI初心者がローカルで動かして遊ぶLLM

に公開1

イントロ

AI初心者です!

最近はDeepSeek-R1の一件でLLMの情報が沢山目に入るようになりました。ローカルで動かせるものもあるのかと調べて試してみると、個人レベルでも思ったより高品質なLLMが動かせたので、最終的にMac mini M4モデルをLLM専用機として設けました。今回のポストではその経緯や試したLLMについて紹介したいと思います。

AI初心者としての経験

以前Tensorflowが出現したタイミングでは、NVIDIA GeForce GTX9xxか1xxxあたりのグラフィックボードでTensorflowのモデル学習プログラムを試したことがありました。テクノロジーに関する知識がないままあれこれ試しましたが、日本語が出力できる何かにはなったものの、意味を成す文章は生成できませんでした。

ゲーミングPCで試す

そして現在、ゲーミングPCとして使っているマシンには占有VRAMが8GBあるのですが(RTX 3070 Ti)、これで何か動かせないかと調べてみました。

最初に行きついたのはw64devkitllama.cppのllama-serverでした。これで当初の目的としていたDeepSeek-R1がローカルで動かせました。ちなみに 60 token/sec以上の早さで快適に動いたのは8BパラメータのQ6_K_L量子化モデルあたりでした。それ以上になるとVRAMに乗り切らず、実行速度が一気に落ち込んだと思います。

そして一度満足に動かせるものが見つかると、そこから更に調べて同じくらいのサイズのモデルが他にもたくさんあることを知り、いろいろ試したくなりました。

またllama-serverの代わりに、OllamaOpen 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サービスと連動させているリバースプロキシなどを用意すれば、比較的安心して外出時もインターネット経由で使えるようにできるのでおすすめです。私はnginxautheliaで構築しています。今回のポストではこれらの詳細は省きます。

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のモデルライブラリ以外でも利用できるものがあるという簡単な紹介でした。

using-two-gemma2-models

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ということで活用の幅が広がります。

% ollama pull gemma3:27b
pulling manifest
pulling afa0ea2ef463... 100% ▕████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▏  17 GB
pulling e0a42594d802... 100% ▕████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▏  358 B
pulling dd084c7d92a3... 100% ▕████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▏ 8.4 KB
pulling 0a74a8735bf3... 100% ▕████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▏   55 B
pulling 9e5186b1ce17... 100% ▕████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▏  490 B
verifying sha256 digest
writing manifest
success

% ollama ps
NAME          ID              SIZE     PROCESSOR    UNTIL
gemma3:27b    30ddded7fba6    22 GB    100% GPU     4 minutes from now

% ollama show gemma3:27b
  Model
    architecture        gemma3
    parameters          27.4B
    context length      8192
    embedding length    5376
    quantization        Q4_K_M

  Parameters
    stop           "<end_of_turn>"
    temperature    0.1

  License
    Gemma Terms of Use
    Last modified: February 21, 2024