このトピックでは、Qwen3-32B モデルを例として使用し、vLLM と SGLang を使用して Container Service for Kubernetes (ACK) クラスターにスタンドアロンの大規模言語モデル (LLM) 推論サービスをデプロイする方法を説明します。
背景
Qwen3-32B
Qwen3-32B は Qwen シリーズの最新の進化形であり、推論効率と会話の流暢さの両方に最適化された 32.8B パラメーターの高密度アーキテクチャを特徴としています。
主な特徴:
デュアルモードパフォーマンス: 論理的推論、数学、コード生成などの複雑なタスクに優れていると同時に、一般的なテキスト生成においても高い効率を維持します。
高度な機能: 命令追従、マルチターン対話、創造的なライティング、AI エージェントタスクのためのクラス最高のツール使用において優れたパフォーマンスを発揮します。
大規模なコンテキストウィンドウ: ネイティブで最大 32,000 トークンのコンテキストを処理し、YaRN テクノロジーを使用して 131,000 トークンまで拡張できます。
多言語サポート: 100 以上の言語を理解し、翻訳できるため、グローバルなアプリケーションに最適です。
vLLM
vLLM は、LLM の推論とサービングを最適化するために設計された高速で軽量なライブラリで、スループットを大幅に向上させ、待機時間を短縮します。
コアな最適化:
PagedAttention: Key-Value (KV) キャッシュを効率的に管理してメモリの無駄を最小限に抑え、スループットを向上させる革新的なアテンションアルゴリズムです。
高度な推論: 連続バッチ処理、投機的デコーディング、CUDA/HIP グラフアクセラレーションにより、速度と使用率を向上させます。
広範な並列処理: テンソル並列 (TP)、パイプライン並列 (PP)、データ並列 (DP)、エキスパート並列 (EP) をサポートし、複数の GPU にスケールアウトします。
量子化サポート: GPTQ、AWQ、INT4/8、FP8 などの一般的な量子化フォーマットと互換性があり、モデルのメモリフットプリントを削減します。
幅広い互換性:
ハードウェアとモデル: NVIDIA、AMD、Intel の GPU で動作し、Hugging Face や ModelScope の主流モデル (Qwen、Llama、Deepseek、E5-Mistral など) をサポートします。
標準 API: OpenAI 互換の API を提供し、既存のアプリケーションへの統合を容易にします。
詳細については、「vLLM GitHub」をご参照ください。
SGLang
SGLang は、高性能なバックエンドと柔軟なフロントエンドを組み合わせた推論エンジンで、LLM とマルチモーダルワークロードの両方に対応するように設計されています。
高性能バックエンド:
高度なキャッシング: RadixAttention (効率的なプレフィックスキャッシュ) と PagedAttention を搭載し、複雑な推論タスク中のスループットを最大化します。
効率的な実行: 連続バッチ処理、投機的デコーディング、PD 分離、マルチ LoRA バッチ処理を使用して、複数のユーザーとファインチューニングされたモデルに効率的にサービスを提供します。
完全な並列処理と量子化: TP、PP、DP、EP の並列処理と、さまざまな量子化手法 (FP8、INT4、AWQ、GPTQ) をサポートします。
柔軟なフロントエンド:
強力なプログラミングインターフェイス: 開発者は、連鎖生成、制御フロー、並列処理などの機能を使用して、複雑なアプリケーションを簡単に構築できます。
マルチモーダルと外部インタラクション: テキストや画像などのマルチモーダル入力をネイティブでサポートし、外部ツールとのインタラクションを可能にするため、高度なエージェントワークフローに最適です。
幅広いモデルサポート: 生成モデル (Qwen、DeepSeek、Llama)、埋め込みモデル (E5-Mistral)、報酬モデル (Skywork) をサポートします。
詳細については、「SGLang GitHub」をご参照ください。
前提条件
Kubernetes 1.22 以降を実行する Container Service for Kubernetes (ACK) クラスターが作成され、GPU アクセラレーションノードが追加されていること。詳細については、「ACK マネージドクラスターの作成」および「クラスターへの GPU ノードの追加」をご参照ください。
このトピックで説明するプロセスには、64 GB 以上の GPU メモリが必要です。ecs.gn8is-2x.8xlarge インスタンスタイプを推奨します。詳細については、「GPU コンピューティング最適化インスタンスファミリー gn8is」をご参照ください。
モデルのデプロイ
ステップ 1: Qwen3-32B モデルファイルを準備する
次のコマンドを実行して、ModelScope から Qwen3-32B モデルをダウンロードします。
git-lfsプラグインがインストールされていない場合は、yum install git-lfsまたはapt-get install git-lfsを実行してインストールします。その他のインストール方法については、「Git Large File Storage のインストール」をご参照ください。git lfs install GIT_LFS_SKIP_SMUDGE=1 git clone https://www.modelscope.cn/Qwen/Qwen3-32B.git cd Qwen3-32B/ git lfs pullOSS コンソールにログインし、バケットの名前を記録します。まだ作成していない場合は、「バケットの作成」をご参照ください。Object Storage Service (OSS) にディレクトリを作成し、そこにモデルをアップロードします。
ossutil のインストールと使用方法の詳細については、「ossutil のインストール」をご参照ください。
ossutil mkdir oss://<your-bucket-name>/Qwen3-32B ossutil cp -r ./Qwen3-32B oss://<your-bucket-name>/Qwen3-32Bクラスター用に
llm-modelという名前の永続ボリューム (PV) と永続ボリューム要求 (PVC) を作成します。詳細な手順については、「PV と PVC の作成」をご参照ください。コンソールを使用した例
PV の作成
ACK コンソールにログインします。左側のナビゲーションウィンドウで、[クラスター] をクリックします。
[クラスター] ページで、目的のクラスターを見つけてその名前をクリックします。左側のナビゲーションウィンドウで、 を選択します。
[ボリューム] ページで、右上隅にある [作成] をクリックします。
[ボリュームの作成] ダイアログボックスで、パラメーターを設定します。
次の表に、サンプル PV の基本設定を示します。
パラメーター
説明
PV タイプ
この例では、OSS を選択します。
ボリューム名
この例では、llm-model と入力します。
アクセス証明書
OSS バケットへのアクセスに使用する AccessKey ID と AccessKey シークレットを設定します。
バケット ID
前のステップで作成した OSS バケットを選択します。
OSS パス
モデルが配置されているパス (例:
/Qwen3-32B) を入力します。
PVC の作成
[クラスター] ページで、目的のクラスターを見つけてその名前をクリックします。左側のナビゲーションウィンドウで、 を選択します。
[PersistentVolumeClaims] ページで、右上隅にある [作成] をクリックします。
[PersistentVolumeClaim の作成] ページで、パラメーターを設定します。
次の表に、サンプル PVC の基本設定を示します。
設定項目
説明
PVC タイプ
この例では、OSS を選択します。
名前
この例では、llm-model と入力します。
割り当てモード
この例では、[既存のボリューム] を選択します。
既存のボリューム
[PV の選択] ハイパーリンクをクリックし、作成した PV を選択します。
kubectl を使用した例
次の YAML テンプレートを使用して、
llm-model.yamlという名前のファイルを作成します。このファイルには、Secret、静的 PV、および 静的 PVC の設定が含まれています。apiVersion: v1 kind: Secret metadata: name: oss-secret stringData: akId: <your-oss-ak> # OSS バケットへのアクセスに使用する AccessKey ID。 akSecret: <your-oss-sk> # OSS バケットへのアクセスに使用する AccessKey シークレット。 --- apiVersion: v1 kind: PersistentVolume metadata: name: llm-model labels: alicloud-pvname: llm-model spec: capacity: storage: 30Gi accessModes: - ReadOnlyMany persistentVolumeReclaimPolicy: Retain csi: driver: ossplugin.csi.alibabacloud.com volumeHandle: llm-model nodePublishSecretRef: name: oss-secret namespace: default volumeAttributes: bucket: <your-bucket-name> # バケット名。 url: <your-bucket-endpoint> # エンドポイント (例: oss-cn-hangzhou-internal.aliyuncs.com)。 otherOpts: "-o umask=022 -o max_stat_cache_size=0 -o allow_other" path: <your-model-path> # この例では、パスは /Qwen3-32B/ です。 --- apiVersion: v1 kind: PersistentVolumeClaim metadata: name: llm-model spec: accessModes: - ReadOnlyMany resources: requests: storage: 30Gi selector: matchLabels: alicloud-pvname: llm-modelSecret、静的 PV、および 静的 PVC を作成します。
kubectl create -f llm-model.yaml
ステップ 2: 推論サービスをデプロイする
次の YAML テンプレートを使用して、vLLM および SGLang 推論エンジンを使用して ACK にスタンドアロン LLM 推論サービスをデプロイします。
vLLM を使用してスタンドアロン推論サービスをデプロイする
vllm.yamlという名前のファイルを作成します。vLLM フレームワークを使用して、スタンドアロン LLM 推論サービスをデプロイします。
kubectl create -f vllm.yaml
SGLang を使用してスタンドアロン推論サービスをデプロイする
sglang.yamlという名前のファイルを作成します。SGLang フレームワークを使用して、スタンドアロン LLM 推論サービスをデプロイします。
kubectl create -f sglang.yaml
ステップ 3: 推論サービスを検証する
次のコマンドを実行して、推論サービスとローカル環境の間にポートフォワーディングを確立します。
重要kubectl port-forwardによって確立されたポートフォワーディングは、本番環境レベルの信頼性、セキュリティ、スケーラビリティに欠けています。開発およびデバッグ目的でのみ使用し、本番環境では使用しないでください。Kubernetes クラスターでの本番環境対応のネットワークソリューションについては、「Ingress 管理」をご参照ください。kubectl port-forward svc/inference-service 8000:8000期待される出力:
Forwarding from 127.0.0.1:8000 -> 8000 Forwarding from [::1]:8000 -> 8000次のコマンドを実行して、モデル推論サービスにサンプルリクエストを送信します:
curl http://localhost:8000/v1/chat/completions -H "Content-Type: application/json" -d '{"model": "/models/Qwen3-32B", "messages": [{"role": "user", "content": "Test"}], "max_tokens": 30, "temperature": 0.7, "top_p": 0.9, "seed": 10}'期待される出力:
{"id":"chatcmpl-d490443cd4094bdf86a1a49144f77444","object":"chat.completion","created":1753684011,"model":"/models/Qwen3-32B","choices":[{"index":0,"message":{"role":"assistant","reasoning_content":null,"content":"<think>\nOkay, the user sent \"Test\". I need to confirm their request first. They might be testing my functionality or want to see my reaction.","tool_calls":[]},"logprobs":null,"finish_reason":"length","stop_reason":null}],"usage":{"prompt_tokens":10,"total_tokens":40,"completion_tokens":30,"prompt_tokens_details":null},"prompt_logprobs":null,"kv_transfer_params":null}この出力は、モデルが与えられた入力 (この例ではテストメッセージ) に基づいて応答を生成できることを示しています。
関連資料
LLM 推論サービスの Prometheus モニタリングを設定する
本番環境では、LLM サービスの正常性とパフォーマンスを監視することが、安定性を維持するために不可欠です。Managed Service for Prometheus と統合することで、詳細なメトリックを収集して、次のことを行うことができます:
障害とパフォーマンスのボトルネックを検出する。
リアルタイムデータで問題をトラブルシューティングする。
長期的なパフォーマンス傾向を分析して、リソース割り当てを最適化する。
LLM のワークロードは頻繁に変動するため、リソースの過剰プロビジョニングやトラフィックスパイク時のパフォーマンス低下につながります。ack-alibaba-cloud-metrics-adapter と統合された Kubernetes Horizontal Pod Autoscaler (HPA) は、次の方法でこの問題を解決します:
リアルタイムの GPU、CPU、メモリ使用率に基づいてポッドを自動的にスケーリングする。
より高度なスケーリングトリガーのためにカスタムメトリックを定義できる。
ピーク時の高可用性を確保し、アイドル期間中のコストを削減する。
Gateway with Inference Extension を使用してインテリジェントなルーティングとトラフィック管理を実装する
ACK Gateway with Inference Extension は、Kubernetes Gateway API 上に構築された強力な Ingress コントローラーで、AI/ML ワークロードのルーティングを簡素化および最適化します。主な特徴は次のとおりです:
モデル対応の負荷分散: 最適化された負荷分散ポリシーを提供し、推論リクエストの効率的な分散を保証します。
インテリジェントなモデルルーティング: リクエストペイロード内のモデル名に基づいてトラフィックをルーティングします。これは、単一のエンドポイントの背後で複数のファインチューニングされたモデル (例: 異なる LoRA バリアント) を管理したり、カナリアリリースのためのトラフィック分割を実装したりするのに最適です。
リクエストの優先順位付け: 異なるモデルに優先度レベルを割り当て、最も重要なモデルへのリクエストが最初に処理されるようにして、サービス品質を保証します。
OSS や File Storage NAS などのサービスに保存されている大規模なモデルファイル (>10 GB) は、ダウンロード時間が長いためにポッドの起動が遅くなる (コールドスタート) 可能性があります。Fluid は、クラスターのノード全体に分散キャッシングレイヤーを作成することでこの問題を解決します。これにより、次の 2 つの主要な方法でモデルの読み込みが大幅に高速化されます:
データスループットの高速化: Fluid は、クラスター内のすべてのノードのストレージ容量とネットワーク帯域幅をプールします。これにより、単一のリモートソースから大きなファイルを取得する際のボトルネックを克服する、高速で並列なデータレイヤーが作成されます。
I/O 待機時間の短縮: Fluid は、モデルファイルを必要とされる計算ノードに直接キャッシュすることで、アプリケーションにローカルでほぼ瞬時のデータアクセスを提供します。この最適化された読み取りメカニズムにより、ネットワーク I/O に関連する長い遅延が解消されます。