Gateway with Inference Extension は、生成 AI リクエストに対する詳細なレート制限をサポートしています。各リクエストの入力と出力に含まれるトークン数をカウントし、事前定義されたレート制限ルールに基づいてリクエストを許可または拒否します。このトピックでは、Gateway with Inference Extension を使用して、トークン数に基づき生成 AI リクエストにグローバルレート制限を適用する方法について説明します。
このトピックでは、Gateway with Inference Extension の バージョン 1.4.0 以降が必要です。
機能説明
トークンベースのグローバルレート制限は、Gateway with Inference Extension の 2 つのコア機能に基づいています:
グローバルレート制限: この機能は、トークンバケットアルゴリズムを使用します。デフォルトでは、各 HTTP リクエストは 1 つのトークンを消費します。各リクエストが消費するトークン数をカスタマイズすることもできます。
生成 AI 可観測性アドオン: このアドオンは、生成 AI アプリケーションの応答からトークン数を読み取り、その値をレート制限に使用します。
トークンバケットアルゴリズム
システムは固定レートでトークンを生成し、バケットが容量に達するまでトークンバケットに追加します。サービス間のリクエストは、処理されるためにトークンを消費する必要があります。十分なトークンが利用可能な場合、リクエストはトークンを消費します。十分なトークンが利用できない場合、リクエストはキューに入れられるか、破棄されることがあります。このアルゴリズムにより、平均データ転送レートがトークン生成レートを超えないようにしつつ、一部のバーストトラフィックにも対応できます。
前提条件
-
推論拡張機能付きゲートウェイ バージョン 1.4.0 以降をインストールし、Gateway API 推論拡張の有効化 を選択しています。 詳細については、「コンポーネントをインストールする」をご参照ください。
mock-vllm アプリケーションがデプロイされています。
生成 AI 可観測性アドオンがデプロイされています。
グローバルレート制限を有効にしました。
レート制限ルールのデプロイ
この例では、mock-vllm アプリケーション のレート制限ルールを作成し、各ユーザーの 1 時間あたりのトークン数を 300 に制限する方法を示します。
token-ratelimit-test.yaml ファイルを作成します。
apiVersion: gateway.envoyproxy.io/v1alpha1 kind: BackendTrafficPolicy metadata: name: token-ratelimit-test spec: targetRefs: - group: gateway.networking.k8s.io kind: HTTPRoute name: mock-route rateLimit: type: Global global: rules: - clientSelectors: - headers: - name: x-user-id type: Distinct limit: requests: 300 unit: Hour cost: response: from: Metadata metadata: # ACK Gateway の生成 AI 可観測性アドオンによって設定されるメトリクス namespace: FILTER_STATE key: wasm.gen_ai.completion.tokensレート制限ルールをデプロイします。
kubectl apply -f token-ratelimit-test.yaml
テストの実行
ゲートウェイの IP アドレスを取得します。
export GATEWAY_ADDRESS=$(kubectl get gateway/mock-gateway -o jsonpath='{.status.addresses[0].value}') echo ${GATEWAY_ADDRESS}sleep アプリケーションから 5 つのテストリクエストを送信します。
kubectl exec deployment/sleep -it -- curl -X POST ${GATEWAY_ADDRESS}/v1/chat/completions -H 'Content-Type: application/json' -H "host: example.com" -d '{ "model": "mock", "max_completion_tokens": 100, "temperature": 0, "messages": [ { "role": "user", "content": "introduce yourself" } ] }' -v -H "x-user-id: one" |grep "^< HTTP"期待される出力:
< HTTP/1.1 200 OK < HTTP/1.1 200 OK < HTTP/1.1 200 OK < HTTP/1.1 200 OK < HTTP/1.1 429 Too Many Requests最初の 4 つのリクエストは
200を返し、5 番目のリクエストは429を返します。これは、mock-vllm アプリケーションがリクエストごとに 76 トークンを含む固定長の応答を返すためです。3 回のリクエスト後、228 トークンが消費されますが、これはまだ 300 トークンの制限内です。したがって、4 番目のリクエストは成功します。4 番目のリクエスト後、304 トークンが消費され、制限を超えます。5 番目のリクエストは
429 Too Many Requestsを返します。
参考文献
上記で示したユーザーごとのトークンレート制限に加えて、以下のトピックを読むことで、より高度なレート制限戦略を実装できます: