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的生成速率,同时又能应对一定程度的突发流量。
前提条件
已安装1.4.0版本的Gateway with Inference Extension并勾选启用Gateway API推理扩展。操作入口,请参见安装组件。
已部署mock-vllm应用。
已开启全局限流。
部署限流规则
本示例将演示为mock-vllm应用创建限流规则,限制每个用户每小时最多消耗300个Token。
创建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应用会为每个请求返回一个固定长度的响应,响应的Token数为76。 访问3次后,一共消耗了228个Token,此时并未超出限额,因此第4次访问依旧会成功。 第4次访问完成后,一共消耗了304个Token,此时超出了限额。第5次访问返回
429 Too Many Requests
。
相关文档
除了上述的“分用户Token限流”外,您可以通过阅读以下文档,来实现更加丰富的限流策略: