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 が標準的なリクエストに応答できること。
このループが失敗する場合、スケーリングやルーティングを行っても解決しません。まずは基盤を修正してください。
Optional learning community: https://t.me/GyaanSetuAi
