Kubernetes 上での初めての LLM API

Kubernetes 上で LLM を実行することは、標準的な Web アプリケーションを実行することとは異なります。単にリクエスト数に基づいてスケールさせるのではなく、GPU 容量とモデルの重みに基づいてスケールさせる必要があります。

このガイドでは、モデルを GPU ノードにデプロイし、API として公開し、curl リクエストで呼び出す方法を説明します。

使用するツール:

  • モデル: Qwen/Qwen2.5-1.5B-Instruct
  • エンジン: vLLM
  • インフラストラクチャ: NVIDIA GPU サポートを備えた Kubernetes

ステップ 1: GPU 容量を確認する

開始する前に、Kubernetes がハードウェアを認識していることを確認してください。次のコマンドを実行します: kubectl get nodes -o=custom-columns=NAME:.metadata.name,GPU:.status.allocatable.nvidia\.com/gpu

GPU 列が空の場合は、作業を中断してください。まず NVIDIA device plugin を修正する必要があります。

ステップ 2: モデルへのアクセスを保護する

公開モデルであっても、Hugging Face トークンを使用してください。これにより、後でプライベートモデルに切り替えることが容易になります。

  • 名前空間の作成: kubectl create namespace llm-demo
  • トークンのための Secret の作成: kubectl create secret generic hf-token -n llm-demo --from-literal=HF_TOKEN="your_token_here"

ステップ 3: モデルサーバーをデプロイする

vLLM は、バッチ処理、トークン化、および OpenAI 互換 API などの複雑な処理を肩代わりしてくれるため、これを使用します。

以下の主要な要件を含むデプロイメントファイルを作成します:

  • 1 つの GPU をリクエスト: nvidia.com/gpu: 1
  • /dev/shm をマウント: モデルサーバーがクラッシュするのを防ぐために、共有メモリが必要です。
  • Secret を使用: HF_TOKEN をコンテナに渡します。

設定を適用します: kubectl apply -f qwen-vllm.yaml

ステップ 4: API を検証する

「Running」ステータスを鵜呑みにしないでください。Pod は、巨大なモデルファイルをダウンロードしている間も「Running」状態になります。ログを監視してください: kubectl logs -n llm-demo -f deployment/qwen-vllm

サーバーがポート 8000 で待機していることを確認するまで待ちます。

ポートフォワーディングでテストします: kubectl port-forward -n llm-demo svc/qwen-vllm 8000:8000

curl リクエストを実行します:

curl http://127.0.0.1:8000/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{
  "model": "Qwen/Qwen2.5-1.5B-Instruct",
  "messages": [{"role": "user", "content": "Explain Kubernetes in two sentences."}],
  "max_tokens": 120
}'

ゴール:

生の GPU 容量から、実際に動作する API へと到達しました。これにより、以下が証明されました:

  • Kubernetes が GPU ワークロードをスケジューリングできること。
  • コンテナがハードウェアにアクセスできること。
  • モデルサーバーがメモリに重みをロードできること。
  • API が標準的なリクエストに応答できること。

このループが失敗する場合、スケーリングやルーティングを行っても解決しません。まずは基盤を修正してください。

Source: https://dev.to/the-persistent-engineer/your-first-llm-api-on-kubernetes-from-model-to-curl-request-4l1j

Optional learning community: https://t.me/GyaanSetuAi