すべてのプロダクト
Search
ドキュメントセンター

Container Service for Kubernetes:スタンドアロン LLM 推論サービスをデプロイする

最終更新日:Sep 19, 2025

このトピックでは、Qwen3-32B モデルを例として使用し、vLLM と SGLang を使用して Container Service for Kubernetes (ACK) クラスターにスタンドアロンの大規模言語モデル (LLM) 推論サービスをデプロイする方法を説明します。

背景

  • Qwen3-32B

    Qwen3-32B は Qwen シリーズの最新の進化形であり、推論効率と会話の流暢さの両方に最適化された 32.8B パラメーターの高密度アーキテクチャを特徴としています。

    主な特徴:

    • デュアルモードパフォーマンス: 論理的推論、数学、コード生成などの複雑なタスクに優れていると同時に、一般的なテキスト生成においても高い効率を維持します。

    • 高度な機能: 命令追従、マルチターン対話、創造的なライティング、AI エージェントタスクのためのクラス最高のツール使用において優れたパフォーマンスを発揮します。

    • 大規模なコンテキストウィンドウ: ネイティブで最大 32,000 トークンのコンテキストを処理し、YaRN テクノロジーを使用して 131,000 トークンまで拡張できます。

    • 多言語サポート: 100 以上の言語を理解し、翻訳できるため、グローバルなアプリケーションに最適です。

    詳細については、ブログGitHub、およびドキュメントをご参照ください。

  • 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 モデルファイルを準備する

  1. 次のコマンドを実行して、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 pull
  2. OSS コンソールにログインし、バケットの名前を記録します。まだ作成していない場合は、「バケットの作成」をご参照ください。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
  3. クラスター用に llm-model という名前の永続ボリューム (PV) と永続ボリューム要求 (PVC) を作成します。詳細な手順については、「PV と PVC の作成」をご参照ください。

    コンソールを使用した例

    1. PV の作成

      • ACK コンソールにログインします。左側のナビゲーションウィンドウで、[クラスター] をクリックします。

      • [クラスター] ページで、目的のクラスターを見つけてその名前をクリックします。左側のナビゲーションウィンドウで、[ボリューム] > [永続ボリューム] を選択します。

      • [ボリューム] ページで、右上隅にある [作成] をクリックします。

      • [ボリュームの作成] ダイアログボックスで、パラメーターを設定します。

        次の表に、サンプル PV の基本設定を示します。

        パラメーター

        説明

        PV タイプ

        この例では、OSS を選択します。

        ボリューム名

        この例では、llm-model と入力します。

        アクセス証明書

        OSS バケットへのアクセスに使用する AccessKey ID と AccessKey シークレットを設定します。

        バケット ID

        前のステップで作成した OSS バケットを選択します。

        OSS パス

        モデルが配置されているパス (例: /Qwen3-32B) を入力します。

    2. PVC の作成

      • [クラスター] ページで、目的のクラスターを見つけてその名前をクリックします。左側のナビゲーションウィンドウで、[ボリューム] > [永続ボリューム要求] を選択します。

      • [PersistentVolumeClaims] ページで、右上隅にある [作成] をクリックします。

      • [PersistentVolumeClaim の作成] ページで、パラメーターを設定します。

        次の表に、サンプル PVC の基本設定を示します。

        設定項目

        説明

        PVC タイプ

        この例では、OSS を選択します。

        名前

        この例では、llm-model と入力します。

        割り当てモード

        この例では、[既存のボリューム] を選択します。

        既存のボリューム

        [PV の選択] ハイパーリンクをクリックし、作成した PV を選択します。

    kubectl を使用した例

    1. 次の 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-model
    2. Secret静的 PV、および 静的 PVC を作成します。

      kubectl create -f llm-model.yaml

ステップ 2: 推論サービスをデプロイする

次の YAML テンプレートを使用して、vLLM および SGLang 推論エンジンを使用して ACK にスタンドアロン LLM 推論サービスをデプロイします。

vLLM を使用してスタンドアロン推論サービスをデプロイする

  1. vllm.yaml という名前のファイルを作成します。

    YAML テンプレートを展開して表示

    apiVersion: apps/v1
    kind: StatefulSet
    metadata:
      labels:
        # prometheus がスクレイプするため
        alibabacloud.com/inference-workload: vllm-inference
        alibabacloud.com/inference_backend: vllm
      name: vllm-inference
      namespace: default
    spec:
      replicas: 1
      selector:
        matchLabels:
          alibabacloud.com/inference-workload: vllm-inference
          alibabacloud.com/inference_backend: vllm
      template:
        metadata:
          labels:
            alibabacloud.com/inference-workload: vllm-inference
            alibabacloud.com/inference_backend: vllm
        spec:
          volumes:
          - name: model
            persistentVolumeClaim:
              claimName: llm-model
          - name: dshm
            emptyDir:
              medium: Memory
              sizeLimit: 15Gi
          containers:
          - command:
            - sh
            - -c
            - vllm serve /models/Qwen3-32B --port 8000 --trust-remote-code --max-model-len 2048 --gpu-memory-utilization 0.85 --tensor-parallel-size 2
    #        image: vllm/vllm-openai:v0.10.0
            image: kube-ai-registry.cn-shanghai.cr.aliyuncs.com/kube-ai/vllm:v0.10.0
            name: vllm
            ports:
            - containerPort: 8000
              name: http
            readinessProbe:
              initialDelaySeconds: 30
              periodSeconds: 10
              tcpSocket:
                port: 8000
            resources:
              limits:
                nvidia.com/gpu: "2"
                memory: "16Gi"
                cpu: "4"
              requests:
                nvidia.com/gpu: "2"
                memory: "16Gi"
                cpu: "4"
            volumeMounts:
            - mountPath: /models/Qwen3-32B
              name: model
            - mountPath: /dev/shm
              name: dshm
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: inference-service
    spec:
      type: ClusterIP
      ports:
        - port: 8000
          protocol: TCP
          targetPort: 8000
      selector:
        alibabacloud.com/inference-workload: vllm-inference
  2. vLLM フレームワークを使用して、スタンドアロン LLM 推論サービスをデプロイします。

    kubectl create -f vllm.yaml

SGLang を使用してスタンドアロン推論サービスをデプロイする

  1. sglang.yaml という名前のファイルを作成します。

    YAML テンプレートを展開して表示

    apiVersion: apps/v1
    kind: StatefulSet
    metadata:
      labels:
        # prometheus がスクレイプするため
        alibabacloud.com/inference-workload: sgl-inference
        alibabacloud.com/inference_backend: sglang
      name: sgl-inference
      namespace: default
    spec:
      replicas: 1
      selector:
        matchLabels:
          alibabacloud.com/inference-workload: sgl-inference
          alibabacloud.com/inference_backend: sglang
      template:
        metadata:
          labels:
            alibabacloud.com/inference-workload: sgl-inference
            alibabacloud.com/inference_backend: sglang
        spec:
          volumes:
            - name: model
              persistentVolumeClaim:
                claimName: llm-model
            - name: dshm
              emptyDir:
                medium: Memory
                sizeLimit: 15Gi
          containers:
            - command:
                - sh
                - -c
                - "python3 -m sglang.launch_server --model-path /models/Qwen3-32B --tp 2 --trust-remote-code  --context-length 2048 --host 0.0.0.0 --port 8000 --enable-metrics"
              image: anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/anolis-docker-images/docker-temp:0.3.4.post2-sglang0.4.10.post2-pytorch2.7.1.8-cuda12.8.1-py312-alinux3.2104
              name: sglang
              ports:
                - containerPort: 8000
                  name: http
              readinessProbe:
                initialDelaySeconds: 30
                periodSeconds: 10
                tcpSocket:
                  port: 8000
              resources:
                limits:
                  nvidia.com/gpu: "2"
                  memory: "16Gi"
                  cpu: "4"
                requests:
                  nvidia.com/gpu: "2"
                  memory: "16Gi"
                  cpu: "4"
              volumeMounts:
                - mountPath: /models/Qwen3-32B
                  name: model
                - mountPath: /dev/shm
                  name: dshm
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: inference-service
    spec:
      type: ClusterIP
      ports:
        - port: 8000
          protocol: TCP
          targetPort: 8000
      selector:
        alibabacloud.com/inference-workload: sgl-inference
    
  2. SGLang フレームワークを使用して、スタンドアロン LLM 推論サービスをデプロイします。

    kubectl create -f sglang.yaml

ステップ 3: 推論サービスを検証する

  1. 次のコマンドを実行して、推論サービスとローカル環境の間にポートフォワーディングを確立します。

    重要

    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
  2. 次のコマンドを実行して、モデル推論サービスにサンプルリクエストを送信します:

    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 推論サービスの自動スケーリングを設定する

    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 バリアント) を管理したり、カナリアリリースのためのトラフィック分割を実装したりするのに最適です。

    • リクエストの優先順位付け: 異なるモデルに優先度レベルを割り当て、最も重要なモデルへのリクエストが最初に処理されるようにして、サービス品質を保証します。

  • Fluid 分散キャッシングでモデルの読み込みを高速化する

    OSS や File Storage NAS などのサービスに保存されている大規模なモデルファイル (>10 GB) は、ダウンロード時間が長いためにポッドの起動が遅くなる (コールドスタート) 可能性があります。Fluid は、クラスターのノード全体に分散キャッシングレイヤーを作成することでこの問題を解決します。これにより、次の 2 つの主要な方法でモデルの読み込みが大幅に高速化されます:

    • データスループットの高速化: Fluid は、クラスター内のすべてのノードのストレージ容量とネットワーク帯域幅をプールします。これにより、単一のリモートソースから大きなファイルを取得する際のボトルネックを克服する、高速で並列なデータレイヤーが作成されます。

    • I/O 待機時間の短縮: Fluid は、モデルファイルを必要とされる計算ノードに直接キャッシュすることで、アプリケーションにローカルでほぼ瞬時のデータアクセスを提供します。この最適化された読み取りメカニズムにより、ネットワーク I/O に関連する長い遅延が解消されます。