🦙

[local LLMも] LiteLLM Proxy x docker-composeでLLM共通基盤を整備する

に公開

最近、いろんなアプリで LLM を使うことが増えてきました。
しかし、アプリごとに OpenAI のトークン入れたり、呼び出すモデルごとに別々のクライアントを書くのは面倒なので LiteLLM Proxy というものを使ってまとめたいです。

LiteLLM Proxy はLLMの呼び出しゲートウェイ的なことをしてくれて、LiteLLMからモデルを指定すると OpenAIやら Anthropic のモデルを呼び出すことができます。

LiteLLM Proxy のことは職場で聞いてなんとなく知ってたので使おうと思っていたのですが、手元にある程度のGPUがあるのでLocal LLMも使いたいです。というわけで、Localなモデルも含めてすべてLLMの呼び出しをLiteLLM Proxyに寄せて、LLMの呼び出し共通基盤を作ってみました。

課題としてはざっくり二つ。
まず、Local LLM を呼び出せること。モデルの管理も設定もなるべくファイルで管理したいです。
もう一つは、Docker Compose だけで完結させたかったことです。GPU 使える環境に移したり、PC に余計なライブラリや設定を残さず動かせるようにしたいです。

今回作成した基盤のサンプルを手順とともにGitHubで公開しています:
https://github.com/argonism/l3m#

構築の方針とアーキテクチャ

やったことはシンプルです。Docker Compose で以下をまとめて立ち上げました。

  • Ollama: Local LLM のホストです。モデルの追加や更新は ollama-init で管理。
  • Ollama-init: Ollamaでモデルをインストールするためのコンテナ
  • PostgreSQL: LiteLLM のAdmin画面を使うために必要。
  • LiteLLM proxy: LLM 呼び出しゲートウェイ
    (Optional)
  • Prometheus + Grafana: 詳しい監視用

あとはdocker-composeファイルで設定ファイルを含めて上げます。

ネットワーク

この基盤を色々なアプリケーションから使うために、liteLLMだけそとのネットワークに露出させます。externalなネットワークを用意しておいて、そこにLiteLLMを入れます。
LLMを叩きたいアプリケーションはdockerでホストして、llmネットワークに入れてあげればLLMを叩けるという分けです。他のコンテナは internal に閉じて、基盤の独立性を確保しています。

下記の図はn8nとdifyを設定した例で、このようなイメージでLiteLLMだけ露出させ、LLMを叩くコンテナをllmネットに入れます。

Docker Compose ネットワーク構成図

このやり方のいいところは、Docker Compose だけで環境を完結させられる点です。
アプリやモデルを追加しても Compose 内だけで完結するので、PC に余計なものを残さずに済みます。
GPU 環境に移す場合も、Compose ファイルごと持っていけば大体そのまま動きます。

実際にやってみた結果

言ってみればそこまで色々やったわけではないですが、環境を汚さずにサッと始めるにはシンプルでちょうど良いかと思います。

n8n, dify から LiteLLM 経由で Local LLM を呼ぶタスクが問題なく動きました。一応LiteLLMにもUsageを見たりログを見る簡単な機能はありますが、やろうと思えば Prometheus + Grafana で呼び出し状況が見れるので気が向いたらやろうかなと思います。

Discussion