推論拡張機能付きゲートウェイ は、推論サービスの負荷を認識したリクエスト キューイングと優先順位付けスケジューリングをサポートしています。 生成系 AI 推論サーバーがフル稼働している場合、ゲートウェイは、割り当てられたモデルの重要度に基づいてキュー内のリクエストの優先順位を付けます。 これにより、優先度の高いモデルのリクエストが最初に処理されるようになります。 このトピックでは、推論拡張機能付きゲートウェイ のこれらの機能について紹介します。
この機能には、推論拡張機能付きゲートウェイ の バージョン 1.4.0 以降が必要です。
背景
生成系 AI 推論サービスの場合、単一の推論サーバーのリクエスト スループットは、その GPU リソースによって厳密に制限されます。 多くの同時リクエストが同じサーバーに送信されると、推論エンジンのキーバリュー(KV)キャッシングなどのリソースが完全に占有され、すべてのリクエストの応答時間とトークン スループットが低下します。
推論拡張機能付きゲートウェイ は、複数のメトリックを監視して各推論サーバーの内部状態を評価することで、この問題に対処します。 サーバーの負荷が容量に達すると、ゲートウェイは受信推論リクエストをキューに入れ、サーバーが過負荷になるのを防ぎ、全体的なサービス品質を維持します。
前提条件
GPU ノードプールを持つ ACK マネージドクラスター が作成されている。また、ACS GPU 計算能力 を使用するために、ACK マネージドクラスターに ACK Virtual Node コンポーネントをインストールすることもできます。
推論拡張機能付きゲートウェイ 1.4.0 がインストールされ、[ゲートウェイ API 推論拡張を有効にする] が選択されている。 操作エントリの詳細については、「手順 2: 推論拡張機能付きゲートウェイ コンポーネントをインストールする」をご参照ください。
このトピックで説明されているイメージについては、ACK クラスターには A10 カード、Alibaba Cloud Container Compute Service(ACS)GPU 計算能力には L20(GN8IS) カードを使用することをお勧めします。
LLM イメージのサイズが大きいため、事前に Container Registry に転送し、内部ネットワーク アドレスを使用してプルすることをお勧めします。 パブリック ネットワークからのプルの速度は、クラスターの Elastic IP Address(EIP)の帯域幅構成によって異なり、待ち時間が長くなる可能性があります。
手順
手順 1: サンプル推論サービスをデプロイする
vllm-service.yaml を作成します。
サンプル推論サービスをデプロイします。
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 に追加することで、選択した推論サービスのリクエスト キューイング機能を有効にします。
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です。 キューイングが有効になっていて、バックエンド サーバーがフル稼働している場合、優先度の高いモデルのリクエストは、優先度の低いモデルのリクエストよりも前に処理されます。推論ルーティング構成をデプロイします。
kubectl apply -f inference-pool.yaml
手順 3: ゲートウェイとルーティング ルールをデプロイする
この手順では、ゲートウェイと HTTPRoute を構成して、qwen モデルと travel-helper モデルのリクエストを qwen-pool バックエンド InferencePool にルーティングします。
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ゲートウェイをデプロイします。
kubectl apply -f inference-gateway.yaml
手順 4: キューイングと優先順位付けスケジューリングを検証する
この手順では、vLLM ベンチマーク ツール を使用して、qwen モデルと travel-helper モデルの両方の負荷テストを同時に行い、推論サーバーをフル稼働させます。
ベンチマーク ワークロードをデプロイします。
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ゲートウェイの内部 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}')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% 減少した。