Docker を使ってローカルで LLM を実行する ~ Model Runner クイックスタート ガイド

AI は今や多くのアプリケーションの中核を担う存在になりつつありますが、大規模言語モデル (LLM) をローカルで動かすのは、まだまだ手間がかかるのが現状です。モデルの選定から、ハードウェア固有の問題への対応、パフォーマンスの最適化まで、開発に取りかかる前に行き詰まってしまうことも少なくありません。

一方で、開発やテスト、あるいはオフライン環境での利用など、ローカルで LLM を動かしたいという開発者のニーズは高まり続けています。そこで登場したのが Docker Model Runner です。

現在、Docker Desktop 4.40 (Apple シリコン搭載の macOS 向け) でベータ版として提供されている Model Runner を使えば、LLM の取得・実行・検証がローカル環境で簡単に行えます。面倒なインフラの準備や複雑なセットアップは必要ありません。

Docker Desktop 4.41 で Windows (NVIDIA GPU) のサポートも追加されました。

ベータ版では、以下のような機能を提供しています。

  • OpenAI 互換の API を通じて利用できる、llama.cpp ベースの統合エンジンによるローカル推論
  • Apple シリコンに最適化された GPU アクセラレーション (推論エンジンをホスト プロセスとして直接実行)
  • 既存のコンテナー レジストリと互換性のある OCI アーティファクト形式でパッケージされた、すぐに使える人気モデルのコレクション

この記事では、Docker Model Runner を使って、ローカル環境で LLM を実行する方法をご紹介します。

Docker Model Runner の有効化方法

Docker Model Runner は、Apple シリコン搭載の macOS 向け Docker Desktop 4.40 に標準で含まれており、デフォルトで有効になっています。
ただし、もし何らかの理由で無効になっている場合でも、以下のコマンドひとつで簡単に有効化できます。

docker desktop enable model-runner

デフォルト設定では、Model Runner はホスト上の Docker ソケット経由、またはコンテナーからは model-runner.docker.internal という特別なエンドポイントを通じてアクセスできます。

もし、ホスト上のプロセス (たとえば OpenAI SDK を使ったコード) から TCP 接続で直接アクセスしたい場合は、次のようにポート番号を指定して有効化することも可能です。

docker desktop enable model-runner --tcp 12434

このように、必要に応じて柔軟に設定を変えられます。

Docker Model Runner の CLI を試してみよう

Docker Model Runner の CLI (コマンドライン インターフェース) は、普段の Docker コンテナー操作と似た感覚で使えます。ただし、実行モデルに関してはいくつか注意点もあるので、ここで確認しておきましょう。

このガイドでは、手軽に試せるよう、軽量モデル「SmolLM」(Hugging Face が 2024 年に公開) を使います。軽量なので、リソースの限られたマシンでも動作が軽快で、すぐに反応が返ってきます。

1. モデルを取得する

まずはモデルを取得します。Docker イメージと同様に、タグを省略すると latest が使われますが、今回は具体的に指定してみましょう。

docker model pull ai/smollm2:360M-Q4_K_M

ここで指定しているのは、パラメータ数 360M、4bit 量子化 (Q4_K_M) された SmolLM2 モデルです。Docker が配布するモデルのタグは、以下の形式に従っています。

{モデル名}:{パラメータ数}-{量子化形式}
2. モデルを動かしてみる

モデルを取得したら、実際に質問してみましょう。

docker model run ai/smollm2:360M-Q4_K_M "クジラについて何か豆知識を教えて"

たとえば、以下のような応答が返ってきます。

クジラは、何世紀にもわたって人間の興味を引いてきた壮大な海洋動物です。クジラは鯨偶蹄目 (Cetacea) に属し、海を自在に泳ぐための独自の体構造を持っています。中には、全長 30 メートル、体重 140 トンを超えるものもいます。その力強い尾びれは、高速で泳いだり、深く潜って餌を探したり、捕食者から逃げたりするのに役立ちます。

このクジラ情報が本当に正しいのか。それは正直なところ、筆者は海洋生物学者ではないので断言できません。でも、重要なのはこういった点です。
LLM の出力は、特に軽量モデルや量子化されたモデルでは、必ずしも正確とは限らないということ。得られた情報はきちんと検証することが大切です。

実際に docker model run で何が起きているのか?

このコマンドは、一見するとコンテナーを起動しているように思えますが、実際には違います。

docker model run はコンテナーを立ち上げるのではなく、Docker Desktop 上で動作している Model Runner の Inference Server に対してリクエストを送信しています。このサーバーは llama.cpp をベースとした推論エンジンを使い、指定されたモデルをオンデマンドで読み込み、リクエストに応じた推論を実行します。

モデルは一度読み込まれると、次に別のモデルが要求されるか、一定時間 (現在は 5 分間) 操作がなかった場合にメモリからアンロードされます。

つまり、一度モデルを pull しておけば、docker model run を毎回使わなくても、ホストやコンテナーから直接そのモデルにリクエストを送ることが可能です。

次は、アプリケーションコードの中から Model Runner と連携する方法を見ていきましょう。

GenAI 開発をもっと楽しく!Model Runner を使ってみよう

Model Runner は、OpenAI 互換のエンドポイントを提供しています。

  • コンテナーからアクセスする場合は http://model-runner.docker.internal/engines/v1
  • ホスト プロセスからアクセスする場合 (ポート 12434 で TCP アクセスを有効にしている場合) は http://localhost:12434/engines/v1

このエンドポイントを使えば、OpenAI 互換のクライアントやフレームワークを簡単に接続できます。

Java + LangChain4j の例

今回は、Java アプリケーションをホスト上で直接実行しながら Model Runner を使ってみましょう。
設定はとてもシンプルで、エンドポイントの baseUrl と、使いたいモデル名 (CLI で見た形式) を指定するだけです。

OpenAiChatModel model = OpenAiChatModel.builder()
.baseUrl("http://localhost:12434/engines/v1")
.modelName("ai/smollm2:360M-Q4_K_M")
.build();

String answer = model.chat("クジラについて何か豆知識を教えて");
System.out.println(answer);

これだけで、Model Runner を使ったチャット推論が動きます。

このコードを動かす前に、対象のモデルをローカルに pull 済みである必要があります。

他のモデルも試すには

もちろん「SmolLM だけじゃ物足りない!」という方も多いはず。その場合は、Docker Hub の ai/ 名前空間をチェックしてみてください。

Docker Hub では、ローカル実行に適した人気モデルを厳選して掲載しています。モデルによっては、性能やハードウェアに合わせた複数のバリエーションも用意されています。詳細は、それぞれのモデルの「モデル カード (model card)」にまとめられており、リポジトリの概要ページから確認できます。

今後の展望

今回ご紹介したのは、Docker Model Runner のほんの一部にすぎません。現在もさまざまな機能を開発中で、今後さらに進化していきます。

もっと詳しく知りたい方へ
LLM をローカルで動かす手順を紹介した最新のYouTube チュートリアルもぜひご覧ください。


エクセルソフトは Docker の Preferred Reseller として、Docker Business を販売しています。Docker 製品のライセンスや機能に関するご質問、製品デモのご要望を承っています。お問い合わせはこちらから。


*本記事は、Docker 社が提供している以下の記事から抜粋・転載したものです。

Docker を使用した LLM のローカル実行: モデル ランナーのクイックスタート ガイド

Docker の最新情報をお届けするエクセルソフトのメールニュース登録はこちら

タイトルとURLをコピーしました