Zenn
🤖

Docker Model Runnerでローカル環境にLLM APIサーバーを建てる

に公開

この記事は

Docker Model Runnerを使って、ローカル環境(Mac)上にOpenAI API互換のAPIサーバーを簡単に構築する方法です。

https://docs.docker.com/desktop/features/model-runner/

Docker Model Runnerとは

Docker Desktopの機能の一つで、ローカル環境で簡単にLLMを実行できます。Docker Desktop 4.40から使えます。
2025/04/07現在、Apple SilliconのMacでしか使えないようです。Mac miniのM2 ProモデルおよびMacbook AirのM3モデルで動作確認しています。いずれもメモリーは16Gバイトです。

使用方法

Model Runnerを有効化する

私の場合はDocker Desktopを4.40にアップグレードしただけで使えるようになりました。

$ docker model status
Docker Model Runner is running

もし使えない場合には設定画面の以下の項目にチェックが入っているか確認してください。

Desktop Setting

モデルをダウンロードする

docker model pull イメージ名でモデルをダウンロードできます。mistralの場合は以下のようになります。

docker model pull ai/mistral

使用可能なモデルは以下で確認できます。

https://hub.docker.com/u/ai

試しにコンソールで実行してみる

コンソールでdocker model run モデル名を実行すると、インタラクティブなチャットを実行することができます。

$ docker model run ai/mistral
Interactive chat mode started. Type '/bye' to exit.
> こんにちは。あなたは誰ですか?
 こんにちは!私はAIであり、ここではお尋ねを受け、お答えしています。私はあなたの質問や問題を解決するために、何かを教えることを目的としています。何かお尋ねおいしいと思っていますか?
> /bye
Chat session ended.

curlでAPIを発行してみる

Docker Model RunnerはOpenAI互換のAPIサーバー機能を持っています。ローカルホストからcurlで接続してみましょう。

ポート番号を設定する

まずはホストの待受ポート番号を設定します。今回は9080番を使用することにします。
設定画面からポート番号を入力しましたが、なぜかNaNと表示されて入力できませんでした。

alt text
ポートを入力できない

なので以下のコマンドラインから設定します。

$ docker desktop enable model-runner --tcp 9080

すると、設定画面にもポートが設定されていました。

Port setted

APIにアクセスする

先ほどのように、まずはターミナルからmodelを実行します。

$ docker model run ai/mistral
Interactive chat mode started. Type '/bye' to exit.

この状態で、9080番に対し、curlを実行します。

以下のようなシェルスクリプトを作りました。

test.sh
#!/bin/sh
curl http://localhost:9080/engines/llama.cpp/v1/chat/completions \
    -H "Content-Type: application/json" \
    -d '{
        "model": "ai/mistral",
        "messages": [
            {
                "role": "system",
                "content": "あなたは高校の物理学の教師です。分かりやすく物理学を教えます"
            },
            {
                "role": "user",
                "content": "相対性理論について、日本語で200字以内で教えてください"
            }
        ]
    }'

実行した結果は以下のようになりました。

Console output

OpenAI互換のエンドポイントとしては以下が用意されているようです。

    GET /engines/llama.cpp/v1/models
    GET /engines/llama.cpp/v1/models/{namespace}/{name}
    POST /engines/llama.cpp/v1/chat/completions
    POST /engines/llama.cpp/v1/completions
    POST /engines/llama.cpp/v1/embeddings

ちなみにllama.cppの部分は省略することも可能でhttp://localhost:9080/engines/v1/chat/completionsでもアクセスできました。

別コンテナからアクセスする場合

ちなみにホスト上ではなく、ホスト上の他のコンテナからアクセスする場合にはtcpの設定は不要でhttp://model-runner.docker.internal/でアクセスできます。

Discussion

ログインするとコメントできます