基于生成式AI请求的Token数进行全局限流

Gateway with Inference Extension支持对生成式AI请求实施精细化的限流策略。通过对每个请求中输入和输出的Token数进行统计,然后按照预设的限流规则对请求进行放行或拒绝。本文档介绍如何使用Gateway with Inference Extension对生成式AI请求实施基于Token数的全局限流策略。

重要

本文内容依赖1.4.0及以上版本Gateway with Inference Extension

功能说明

基于Token数的全局限流策略依赖于Gateway with Inference Extension的两项基础能力:

  • 全局限流:全局限流功能基于令牌桶算法。默认情况下,每个HTTP请求会消耗一个令牌。在此基础上,支持用户自定义每个请求消耗的令牌数。

  • 生成式AI可观测插件:该插件可以从生成式AI应用的响应中读取Token数量,并作为限流依据。

令牌桶算法

系统以固定速率生成令牌(Tokens),并加入到令牌桶中,直到容量上限。服务间的请求需要消耗Tokens才能发送成功,如果桶中有足够的Tokens,请求发送时将消耗Token;如果没有足够的Tokens,请求可能会被排队或丢弃。此算法可以保证数据传输的平均速率不会超过Token的生成速率,同时又能应对一定程度的突发流量。

image

前提条件

部署限流规则

本示例将演示为mock-vllm应用创建限流规则,限制每个用户每小时最多消耗300Token。

  1. 创建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
  2. 部署限流规则。

    kubectl apply -f token-ratelimit-test.yaml

发起测试

  1. 获取网关IP。

    export GATEWAY_ADDRESS=$(kubectl get gateway/mock-gateway -o jsonpath='{.status.addresses[0].value}')
    echo ${GATEWAY_ADDRESS}
  2. 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应用会为每个请求返回一个固定长度的响应,响应的Token数为76。 访问3次后,一共消耗了228Token,此时并未超出限额,因此第4次访问依旧会成功。 第4次访问完成后,一共消耗了304Token,此时超出了限额。第5次访问返回429 Too Many Requests

相关文档

除了上述的“分用户Token限流”外,您可以通过阅读以下文档,来实现更加丰富的限流策略: