mdx.jp上のvLLMをCloudflare Tunnel経由でOpenAI互換APIとして公開する
mdx.jp 上で動かした vLLM を Cloudflare Tunnel 経由で外部公開し、OpenAI 互換 API として利用できるようにした手順と注意点
cloudflaretunnelzero-trustvllmllmmdx
台本(フルテキスト)
動画の掛け合いを書き起こしたものです。音声を再生しづらい場合はこちらをお読みください。
オープニング
- mdx.jp 上の vLLM を Cloudflare Tunnel で外部公開
- OpenAI 互換 API としてローカルから安全に利用
- うさぎ
- 今日は mdx.jp 上の vLLM を Cloudflare Tunnel 経由で公開した話を教えてください。
- WhiteCUL
- mdx.jp の A100 を 2 枚使って vLLM を動かし、Cloudflare Tunnel 経由で外部から叩けるようにした記事です。
- うさぎ
- サーバのポートを開けずに済むのが利点ですね。
- WhiteCUL
- そうです。インバウンドポートを開けずに、Cloudflare Tunnel 経由で外部から HTTPS で到達させます。
- うさぎ
- SSH も Cloudflare 経由にまとめているんですね。
- WhiteCUL
- はい。SSH は Cloudflare Zero Trust 経由に寄せています。
vLLM の起動
- vLLM は Docker コンテナで起動、--host 0.0.0.0 が必要
- 127.0.0.1 バインドのままだと cloudflared から 502 になる
- うさぎ
- vLLM の起動でポイントはありますか?
- WhiteCUL
- --host 0.0.0.0 の指定が重要です。127.0.0.1 のままだと cloudflared の別コンテナから届きません。
- うさぎ
- 最初それで 502 エラーになったんですね。
- WhiteCUL
- はい。vLLM はホスト上で動いているのに、外部から 502 が返ってくるのは、このバインドアドレスの違いが原因でした。
- うさぎ
- 起動後は curl で localhost:8000/v1/models で確認できるんですね。
- WhiteCUL
- そうです。モデル一覧が返ってきたら起動成功です。
cloudflared コンテナの起動と Ingress 設定
- --add-host host.docker.internal:host-gateway が必要
- API 用と SSH 用のホスト名を Ingress で振り分け
- うさぎ
- cloudflared の起動でもポイントがあるんですか?
- WhiteCUL
- --add-host host.docker.internal:host-gateway を付けないと、コンテナからホストの 8000 番に届かないです。
- うさぎ
- Ingress の設定はどうやって指定するんですか?
- WhiteCUL
- Zero Trust ダッシュボードで Tunnel を作成して、API 用と SSH 用のホスト名に対応するサービスを指定します。
- うさぎ
- 最後にキャッチオールのルールが必要なんですね。
- WhiteCUL
- http_status:404 をキャッチオールとして入れておくのが必須です。
認証と公開方針
- LLM API は利用コストが高く認証なし公開は避けるべき
- Cloudflare Access による保護か SSH ポートフォワード限定が安全
- うさぎ
- 公開後の認証についても触れられていましたね。
- WhiteCUL
- LLM API はコストが高いので、認証なしでそのまま公開するのは避けた方がよいです。
- うさぎ
- どんな選択肢がありますか?
- WhiteCUL
- Cloudflare Access で保護するか、API 用ホスト名を外部公開せず SSH ポートフォワード経由だけで使う方法があります。
- うさぎ
- Zero Trust SSH の設定も紹介されていましたね。
- WhiteCUL
- ~/.ssh/config に ProxyCommand として cloudflared access ssh を指定すると、22 番ポートを開けずに SSH できます。
thinking モデルの扱い
- thinking モデルの vLLM でのサーブは自然な選択
- 出力に analysis が含まれるので後処理が必要な場合もある
- うさぎ
- thinking モデルを vLLM で使うのはどんな点に注意が必要ですか?
- WhiteCUL
- vLLM でのサーブ自体は自然ですが、thinking モデルの出力は必ずしも素直ではありません。
- うさぎ
- 具体的にはどういうことですか?
- WhiteCUL
- 最終回答の前に analysis のような中間表現が出る場合があり、アプリ側で取り除く処理が必要になることがあります。
- うさぎ
- 外部公開 API なら通常版モデルの方が扱いやすいんですね。
- WhiteCUL
- 推論力を優先したい場面では thinking、素直な出力が必要なら通常版という使い分けが現実的です。
まとめ
- vLLM は --host 0.0.0.0 で起動、cloudflared は host.docker.internal 設定が必要
- 公開後の認証方針を事前に決めておくことが重要
- うさぎ
- 今日の内容をまとめてもらえますか?
- WhiteCUL
- vLLM を --host 0.0.0.0 で起動して、cloudflared には --add-host host.docker.internal を渡すのが重要なポイントです。
- うさぎ
- 公開後の認証も先に決めておくんですね。
- WhiteCUL
- Cloudflare Access か SSH 経由限定で保護するのが安全です。
- うさぎ
- GPU サーバの検証用途に Cloudflare Tunnel をまとめて使えるのが便利ですね。
- WhiteCUL
- DNS と公開経路を Cloudflare 側にまとめられるのは、短期間で立てたり消したりする環境に向いています。