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

Container Service for Kubernetes:インテリジェントな推論ルーティングによる推論リクエストのキューイングと優先順位付けスケジューリングの実装

最終更新日:Aug 30, 2025

推論拡張機能付きゲートウェイ は、推論サービスの負荷を認識したリクエスト キューイングと優先順位付けスケジューリングをサポートしています。 生成系 AI 推論サーバーがフル稼働している場合、ゲートウェイは、割り当てられたモデルの重要度に基づいてキュー内のリクエストの優先順位を付けます。 これにより、優先度の高いモデルのリクエストが最初に処理されるようになります。 このトピックでは、推論拡張機能付きゲートウェイ のこれらの機能について紹介します。

重要

この機能には、推論拡張機能付きゲートウェイバージョン 1.4.0 以降が必要です。

背景

生成系 AI 推論サービスの場合、単一の推論サーバーのリクエスト スループットは、その GPU リソースによって厳密に制限されます。 多くの同時リクエストが同じサーバーに送信されると、推論エンジンのキーバリュー(KV)キャッシングなどのリソースが完全に占有され、すべてのリクエストの応答時間とトークン スループットが低下します。

推論拡張機能付きゲートウェイ は、複数のメトリックを監視して各推論サーバーの内部状態を評価することで、この問題に対処します。 サーバーの負荷が容量に達すると、ゲートウェイは受信推論リクエストをキューに入れ、サーバーが過負荷になるのを防ぎ、全体的なサービス品質を維持します。

前提条件

説明

このトピックで説明されているイメージについては、ACK クラスターには A10 カード、Alibaba Cloud Container Compute Service(ACS)GPU 計算能力には L20(GN8IS) カードを使用することをお勧めします。

LLM イメージのサイズが大きいため、事前に Container Registry に転送し、内部ネットワーク アドレスを使用してプルすることをお勧めします。 パブリック ネットワークからのプルの速度は、クラスターの Elastic IP Address(EIP)の帯域幅構成によって異なり、待ち時間が長くなる可能性があります。

手順

手順 1: サンプル推論サービスをデプロイする

  1. vllm-service.yaml を作成します。

    YAML コンテンツを表示

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      labels:
        app: qwen
      name: qwen
    spec:
      replicas: 5
      selector:
        matchLabels:
          app: qwen
      template:
        metadata:
          annotations:
            prometheus.io/path: /metrics
            prometheus.io/port: "8000"
            prometheus.io/scrape: "true"
          labels:
            app: qwen
        spec:
          containers:
          - command:
            - sh
            - -c
            - vllm serve /models/Qwen-2.5-7B-Instruct --port 8000 --enable_prefix_caching --trust-remote-code --served-model-name /model/qwen --max-model-len 8192 --gpu-memory-utilization 0.95 --enforce-eager --enable-lora --max-loras 2 --max-cpu-loras 4 --lora-modules travel-helper-v1=/models/Qwen-TravelHelper-Lora travel-helper-v2=/models/Qwen-TravelHelper-Lora-v2
            image: registry-cn-hangzhou.ack.aliyuncs.com/dev/qwen-2.5-7b-instruct-lora:v0.1
            imagePullPolicy: IfNotPresent
            name: custom-serving
            ports:
            - containerPort: 8000
              name: http
              protocol: TCP
            readinessProbe:
              failureThreshold: 3
              initialDelaySeconds: 30
              periodSeconds: 30
              successThreshold: 1
              tcpSocket:
                port: 8000
              timeoutSeconds: 1
            resources:
              limits:
                nvidia.com/gpu: "1"
            terminationMessagePath: /dev/termination-log
            terminationMessagePolicy: File
            volumeMounts:
            - mountPath: /dev/shm
              name: dshm
          dnsPolicy: ClusterFirst
          restartPolicy: Always
          schedulerName: default-scheduler
          securityContext: {}
          terminationGracePeriodSeconds: 30
          volumes:
          - emptyDir:
              medium: Memory
              sizeLimit: 30Gi
            name: dshm
    ---
    apiVersion: v1
    kind: Service
    metadata:
      labels:
        app: qwen
      name: qwen
    spec:
      ports:
      - name: http-serving
        port: 8000
        protocol: TCP
        targetPort: 8000
      selector:
        app: qwen
  2. サンプル推論サービスをデプロイします。

    kubectl apply -f vllm-service.yaml

手順 2: 推論ルーティングを構成する

この手順では、InferencePool と InferenceModel リソースを作成します。 inference-epp-env.networking.x-k8s.io/experimental-use-queueing: "true" アノテーションと inference-epp-env.networking.x-k8s.io/experimental-use-scheduler-v2: "true" アノテーションを InferencePool に追加することで、選択した推論サービスのリクエスト キューイング機能を有効にします。

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

    apiVersion: inference.networking.x-k8s.io/v1alpha2
    kind: InferencePool
    metadata:
      annotations:
        inference-epp-env.networking.x-k8s.io/experimental-use-queueing: "true"
        inference-epp-env.networking.x-k8s.io/experimental-use-scheduler-v2: "true"
      name: qwen-pool
      namespace: default
    spec:
      extensionRef:
        group: ""
        kind: Service
        name: qwen-ext-proc
      selector:
        app: qwen
      targetPortNumber: 8000
    ---
    apiVersion: inference.networking.x-k8s.io/v1alpha2
    kind: InferenceModel
    metadata:
      name: qwen-model
    spec:
      criticality: Critical
      modelName: qwen
      poolRef:
        group: inference.networking.x-k8s.io
        kind: InferencePool
        name: qwen-pool
      targetModels:
      - name: qwen
        weight: 100
    ---
    apiVersion: inference.networking.x-k8s.io/v1alpha2
    kind: InferenceModel
    metadata:
      name: travel-helper-model
    spec:
      criticality: Standard
      modelName: travel-helper
      poolRef:
        group: inference.networking.x-k8s.io
        kind: InferencePool
        name: qwen-pool
      targetModels:
      - name: travel-helper-v1
        weight: 100

    この構成では、サンプル推論サービスによって提供される 2 つのモデルを表す 2 つの InferenceModel リソースを定義します。

    • qwen-model: ベースモデル qwen を表し、Critical 重要度レベルが割り当てられます。

    • travel-helper-model: LoRA モデル travel-helper を表し、Standard 重要度レベルが割り当てられます。

    使用可能な重要度レベルは、優先順位の高い順に、Critical > Standard > Sheddable です。 キューイングが有効になっていて、バックエンド サーバーがフル稼働している場合、優先度の高いモデルのリクエストは、優先度の低いモデルのリクエストよりも前に処理されます。

  2. 推論ルーティング構成をデプロイします。

    kubectl apply -f inference-pool.yaml

手順 3: ゲートウェイとルーティング ルールをデプロイする

この手順では、ゲートウェイと HTTPRoute を構成して、qwen モデルと travel-helper モデルのリクエストを qwen-pool バックエンド InferencePool にルーティングします。

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

    apiVersion: gateway.networking.k8s.io/v1
    kind: GatewayClass
    metadata:
      name: inference-gateway
    spec:
      controllerName: gateway.envoyproxy.io/gatewayclass-controller
    ---
    apiVersion: gateway.networking.k8s.io/v1
    kind: Gateway
    metadata:
      name: inference-gateway
    spec:
      gatewayClassName: inference-gateway
      listeners:
        - name: llm-gw
          protocol: HTTP
          port: 8081
    ---
    apiVersion: gateway.networking.k8s.io/v1
    kind: HTTPRoute
    metadata:
      name: llm-route
      namespace: default
    spec:
      parentRefs:
      - group: gateway.networking.k8s.io
        kind: Gateway
        name: inference-gateway
        sectionName: llm-gw
      rules:
      - backendRefs:
        - group: inference.networking.x-k8s.io
          kind: InferencePool
          name: qwen-pool
        matches:
        - headers:
          - type: Exact
            name: X-Gateway-Model-Name
            value: qwen
        - headers:
          - type: RegularExpression
            name: X-Gateway-Model-Name
            value: travel-helper.*
    ---
    apiVersion: gateway.envoyproxy.io/v1alpha1
    kind: BackendTrafficPolicy
    metadata:
      name: backend-timeout
    spec:
      timeout:
        http:
          requestTimeout: 24h
      targetRef:
        group: gateway.networking.k8s.io
        kind: Gateway
        name: inference-gateway
  2. ゲートウェイをデプロイします。

    kubectl apply -f inference-gateway.yaml

手順 4: キューイングと優先順位付けスケジューリングを検証する

この手順では、vLLM ベンチマーク ツール を使用して、qwen モデルと travel-helper モデルの両方の負荷テストを同時に行い、推論サーバーをフル稼働させます。

  1. ベンチマーク ワークロードをデプロイします。

    kubectl apply -f- <<EOF
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      labels:
        app: vllm-benchmark
      name: vllm-benchmark
      namespace: default
    spec:
      progressDeadlineSeconds: 600
      replicas: 1
      revisionHistoryLimit: 10
      selector:
        matchLabels:
          app: vllm-benchmark
      strategy:
        rollingUpdate:
          maxSurge: 25%
          maxUnavailable: 25%
        type: RollingUpdate
      template:
        metadata:
          creationTimestamp: null
          labels:
            app: vllm-benchmark
        spec:
          containers:
          - command:
            - sh
            - -c
            - sleep inf
            image: registry-cn-hangzhou.ack.aliyuncs.com/dev/llm-benchmark:random-and-qa
            imagePullPolicy: IfNotPresent
            name: vllm-benchmark
            resources: {}
            terminationMessagePath: /dev/termination-log
            terminationMessagePolicy: File
          dnsPolicy: ClusterFirst
          restartPolicy: Always
          schedulerName: default-scheduler
          securityContext: {}
          terminationGracePeriodSeconds: 30
    EOF
  2. ゲートウェイの内部 IP を取得します。

    export GW_IP=$(kubectl get svc -n envoy-gateway-system -l gateway.envoyproxy.io/owning-gateway-namespace=default,gateway.envoyproxy.io/owning-gateway-name=inference-gateway -o jsonpath='{.items[0].spec.clusterIP}')
  3. 2 つの別々のターミナル ウィンドウを開き、負荷テストを同時実行します。

    重要

    次のデータはテスト環境で生成されたものであり、参考値です。結果は環境によって異なる場合があります。

    ターミナル 1: qwen (重要)モデルの負荷テスト

    kubectl exec -it deploy/vllm-benchmark -- env GW_IP=${GW_IP} python3 /root/vllm/benchmarks/benchmark_serving.py \
    --backend vllm \
    --model /models/DeepSeek-R1-Distill-Qwen-7B \
    --served-model-name qwen \
    --trust-remote-code \
    --dataset-name random \
    --random-prefix-len 1000 \
    --random-input-len 3000 \
    --random-output-len 3000 \
    --random-range-ratio 0.2 \
    --num-prompts 300 \
    --max-concurrency 60 \
    --host $GW_IP \
    --port 8081 \
    --endpoint /v1/completions \
    --save-result \
    2>&1 | tee benchmark_serving.txt

    予期される出力:

    ============ Serving Benchmark Result ============
    Successful requests:                     293       
    Benchmark duration (s):                  1005.55   
    Total input tokens:                      1163919   
    Total generated tokens:                  837560    
    Request throughput (req/s):              0.29      
    Output token throughput (tok/s):         832.94    
    Total Token throughput (tok/s):          1990.43   
    ---------------Time to First Token----------------
    Mean TTFT (ms):                          21329.91  
    Median TTFT (ms):                        15754.01  
    P99 TTFT (ms):                           140782.55 
    -----Time per Output Token (excl. 1st token)------
    Mean TPOT (ms):                          58.58     
    Median TPOT (ms):                        58.36     
    P99 TPOT (ms):                           91.09     
    ---------------Inter-token Latency----------------
    Mean ITL (ms):                           58.32     
    Median ITL (ms):                         50.56     
    P99 ITL (ms):                            64.12     
    ==================================================

    ターミナル 2: travel-helper (標準)モデルの負荷テスト

    kubectl exec -it deploy/vllm-benchmark -- env GW_IP=${GW_IP} python3 /root/vllm/benchmarks/benchmark_serving.py \
    --backend vllm \
    --model /models/DeepSeek-R1-Distill-Qwen-7B \
    --served-model-name travel-helper \
    --trust-remote-code \
    --dataset-name random \
    --random-prefix-len 1000 \
    --random-input-len 3000 \
    --random-output-len 3000 \
    --random-range-ratio 0.2 \
    --num-prompts 300 \
    --max-concurrency 60 \
    --host $GW_IP \
    --port 8081 \
    --endpoint /v1/completions \
    --save-result \
    2>&1 | tee benchmark_serving.txt

    予期される出力:

    ============ Serving Benchmark Result ============
    Successful requests:                     165       
    Benchmark duration (s):                  889.41    
    Total input tokens:                      660560    
    Total generated tokens:                  492207    
    Request throughput (req/s):              0.19      
    Output token throughput (tok/s):         553.41    
    Total Token throughput (tok/s):          1296.10   
    ---------------Time to First Token----------------
    Mean TTFT (ms):                          44201.12  
    Median TTFT (ms):                        28757.03  
    P99 TTFT (ms):                           214710.13 
    -----Time per Output Token (excl. 1st token)------
    Mean TPOT (ms):                          67.38     
    Median TPOT (ms):                        60.51     
    P99 TPOT (ms):                           118.36    
    ---------------Inter-token Latency----------------
    Mean ITL (ms):                           66.98     
    Median ITL (ms):                         51.25     
    P99 ITL (ms):                            64.87     
    ==================================================

    ベンチマーク結果は、フルロード時の優先順位付けスケジューリングの有効性を確認しています。

    • より速い応答時間:優先度の高い qwen モデルの平均 Time to First Token(TTFT)は、標準優先度の travel-helper モデルよりも 50% 低かった

    • より高い信頼性qwen モデルのリクエスト エラーも 96% 減少した