Mac M4でDocker Model RunnerでLLMをローカル実行

大規模言語モデル(LLM)をローカル環境で動かすのは、まだまだハードルが高いと感じています。モデル選び、ハードウェア設定、パフォーマンス調整など、本格的に開発を始める前に、準備段階でつまずいてしまうことも少なくありません。

そんな中、開発やテスト、オフラインでの利用のために、もっと手軽にLLMをローカルで動かしたいと考えていました。そこで見つけたのが「Docker Model Runner」です。

Docker Desktop 4.40 for macOS (Apple Silicon) のベータ版としてリリースされた Model Runner は、ローカルマシン上でLLMのダウンロード、実行、実験を簡単にしてくれます。面倒なインフラ設定や複雑なセットアップは必要ありません。

今回は、最近MacBook Air M4に乗り換えた私が、GPUも活用しつつ、このDocker Model Runnerを実際に試してみた様子を、セットアップからモデルの実行、そしてちょっとした試行錯誤まで含めてご紹介します。

Docker Model Runner とは?

Docker Model Runner は、ローカルでのLLM実行をシンプルにするためのツールです。主な特徴は以下の通りです。

  • 簡単なローカル推論: llama.cpp をベースにした統合エンジンを搭載し、OpenAI互換のAPIを通じてLLMを利用できます。
  • Apple SiliconでのGPU高速化: 推論エンジンをホストプロセスとして直接実行することで、Apple SiliconのGPUパワーを活かした高速な処理を実現します。
  • 豊富なモデルと配布の容易さ: 人気のあるLLMが標準のOCIアーティファクトとしてパッケージ化されており、Docker Hubから簡単に取得できます。既存のコンテナレジストリインフラを活用した配布も可能です。

Docker Model Runner を使ってみる

1. セットアップと有効化

Docker Model Runnerは、Docker Desktop 4.40以降 (macOS on Apple Silicon) であれば、デフォルトで有効になっています。私の環境でも、Docker Desktopのバージョンを確認すると、すでに対応しているようでした。

 念のため、Docker Desktopの設定画面を確認してみましょう。左側のメニューから「Models」を選択すると、Model Runner関連の項目が表示されるはずです。

さらに、「Settings」 > 「Features in development」と進むと、Docker Model Runnerが有効になっているかを確認できます。

デフォルトでは、Model RunnerはDockerソケットか、コンテナ内の model-runner.docker.internal エンドポイント経由でのみアクセスできます。もし、ホストマシン上のアプリケーション(例えば、開発中のPythonスクリプトなど)から直接TCP経由でアクセスしたい場合は、CLIでポートを指定して有効化するか、GUI設定で有効化します。

CLIで有効化する場合:

Bash

docker desktop enable model-runner --tcp 12434

GUIで設定する場合は、「Settings」 > 「Features in development」にある「Enable host-side TCP support」にチェックを入れ、ポート番号(デフォルトは 12434)を指定します。

ついでに、「Enable Docker AI」にもチェックを入れておきました。これで準備は完了です。

2. モデルのダウンロードと実行

まずは、元記事で紹介されていたHuggingFaceの軽量モデル「SmolLM」を試してみます。Dockerイメージと同じように docker model pull コマンドでモデルをダウンロードします。タグを指定しないと latest になりますが、今回はパラメータ数(360M)と量子化(Q4_K_M)を指定してみます。

Bash

docker model pull ai/smollm2:360M-Q4_K_M

ダウンロードが完了したら、docker model run コマンドで質問を投げてみます。

Bash

docker model run ai/smollm2:360M-Q4_K_M "Give me a fact about whales."

すると… なにやら大量のテキストが出力され、期待した答えとは違う結果になってしまいました。

 

別の質問をしてみても、同様に延々と出力が続いてしまいます。出力の中に「I can not use the model in 32bit…??」という気になる一文が。私のDocker設定に何か問題があるのかもしれません。

ちなみに、Docker Desktopの「Models」画面からも、ダウンロードしたモデルを選択してチャット形式で試すことができます。

3. 別のモデルを試してみる

SmolLM がうまく動かなかったので、他のモデルを探してみることにしました。Docker Hubの ai/ 名前空間 (https://hub.docker.com/u/ai) には、利用可能なモデルのリストがあります。

今回は「ai/deepseek-r1-distill-llama:8B-Q4_K_M」というモデルを試してみます。

Bash

docker model pull ai/deepseek-r1-distill-llama:8B-Q4_K_M

ダウンロード後、再度 docker model run で試してみる。

 

英語だったらなんとなくいけそう??なのか。

 

モデルが不要になった場合は、Docker Desktopの「Models」画面から、対象モデルの横にあるゴミ箱マークをクリックすることで簡単に削除できます。

 

アプリケーションとの連携

Docker Model RunnerはOpenAI互換のAPIを提供しているため、様々なクライアントやフレームワーク(LangChainなど)と連携できます。

  • コンテナ内から: http://model-runner.docker.internal/engines/v1
  • ホストから (TCP有効化時): http://localhost:12434/engines/v1 (ポートは設定による)

docker model runの仕組みについて

Dockerを普段使う方なら、「docker container run」と同じ動作を想像するかもしれません。このコマンドは指定したDockerイメージから新しいコンテナを作成し、その中で指定のコマンドを実行します。アプリケーションを起動するたびに、この「箱」(コンテナ)を用意し、その中でイメージを動かします。一方、「docker model run」は毎回新しいコンテナを起動する「docker container run」とは異なります。

docker model run を実行すると、実際には以下のことが起こっています。

  1. 推論サーバーへのAPIリクエスト: コマンドは、Docker Desktop内で稼働している「Model Runner推論サーバー」に対して、「このモデル(例: ai/smollm2:360M-Q4_K_M)を使って、このプロンプト(例: “Give me a fact about whales.”)で推論してほしい」というAPIリクエストを送信します。この推論サーバーは、llama.cpp をベースにしており、コンテナではなくネイティブなホストプロセスとして実行されています。これにより、Apple SiliconのGPUアクセラレーションなどを効率的に利用できるのです。
  2. モデルのオンデマンド読み込み: 推論サーバーはリクエストを受け取ると、指定されたモデルが現在メモリに読み込まれているかを確認します。
    • もし読み込まれていなければ、ローカルに保存されているモデルファイル(docker model pull でダウンロードしたもの)をメモリ上に読み込みます。この初回読み込みには、モデルのサイズに応じて多少時間がかかります。
    • もし既に読み込まれていれば、このステップはスキップされ、すぐ次のステップに進みます。
  3. 推論の実行: 推論サーバーは、メモリ上に展開されたモデルを使って、受け取ったプロンプトに対する推論(テキスト生成など)を実行します。
  4. 結果の返却: 推論結果が生成されると、それがAPIレスポンスとして docker model run コマンドに返され、私たちのターミナルに表示されます。
  5. モデルのキャッシュと解放: ここがもう一つのポイントです。一度メモリに読み込まれたモデルは、すぐには解放されません。一定時間(現在のベータ版では5分間)、メモリ上にキャッシュされます。これにより、同じモデルに対して続けてリクエストを送った場合、モデルの読み込み時間をスキップして、より高速に応答を返すことができます。そして、5分間そのモデルへのアクセスがないと、自動的にメモリから解放され、リソースを無駄に消費しないようになっています。

まとめ

Docker Model Runnerは、LLMをローカルで簡単に実行できる非常に強力なツールです。まだベータ版であり、今回のようにモデルによっては正常に動作しない場合もありますが、その可能性は非常に高いと感じました。

特に、面倒な環境構築や依存関係の調整から解放され、DockerコマンドやDocker DesktopからスムーズにLLMを操作できるのは大きな利点です。Apple SiliconのGPUを活用できるのも、Macユーザーにとっては魅力的な点でしょう。

今後、さらに多くのモデルがサポートされ、機能も拡充されていくことが期待されます。AI開発のハードルを下げ、より多くの開発者がLLMを活用できるようになる、そんな未来を感じさせてくれるツールでした。

参考