Configure Scaling for Inference Services

目录

介绍

本文档提供了配置推理服务自动扩缩容的分步指南。通过这些设置,您可以优化资源使用,确保高负载时服务可用,并在低负载时释放资源。

关于自动扩缩容器

Knative Serving 支持两种自动扩缩容器:Knative Pod Autoscaler (KPA) 和 Kubernetes 的 Horizontal Pod Autoscaler (HPA)。默认情况下,我们的服务使用 Knative Pod Autoscaler (KPA)。

KPA 设计用于无服务器工作负载,能够基于并发请求数或 RPS(每秒请求数)快速扩容,并能将服务缩容到零副本以节省成本。HPA 更通用,通常基于 CPU 或内存使用等指标进行扩缩容。本指南主要聚焦于通过 Knative Pod Autoscaler (KPA) 配置服务。

步骤

缩容配置

本节介绍如何配置推理服务在无流量时自动缩容到零副本,或保持最小副本数。

启用/禁用缩容到零

您可以配置是否允许推理服务在无流量时缩容到零副本。默认值为 true,允许缩容到零。

使用 InferenceService 资源参数

InferenceServicespec.predictor 字段中设置 minReplicas 参数。

  • minReplicas: 0:允许缩容到零副本。

  • minReplicas: 1:禁用缩容到零副本,至少保持一个副本。

    apiVersion: serving.kserve.io/v1beta1
    kind: InferenceService
    metadata:
      name: demo
      namespace: demo-space
    spec:
      predictor:
        minReplicas: 0
        ...

平台范围内禁用缩容到零

WARNING

一旦平台范围内禁用该功能,所有服务的 minReplicas: 0 配置将被忽略。

您可以修改 全局 ConfigMap 来禁用平台的缩容到零功能。此配置优先级最高,会覆盖所有单个 InferenceService 资源中的设置。

knative-serving 命名空间下的 config-autoscaler ConfigMap 中,将 enable-scale-to-zero 的值修改为 "false"

apiVersion: v1
kind: ConfigMap
metadata:
  annotations:
    "helm.sh/resource-policy": keep
  name: config-autoscaler
  namespace: knative-serving
data:
  enable-scale-to-zero: "false"
  1. 请确保该注解存在,否则您的配置将被恢复为默认值。

配置缩容到零后 Pod 的保留时间

此设置决定自动扩缩容器决定缩容到零后,最后一个 Pod 保持活跃的最短时间,有助于服务在再次接收流量时快速响应。默认值为 0s

您可以选择为单个服务配置,或修改全局 ConfigMap 使该设置对所有服务生效。

方法一:使用 InferenceService 注解

InferenceServicespec.predictor.annotations 中添加 autoscaling.knative.dev/scale-to-zero-pod-retention-period 注解。

apiVersion: serving.kserve.io/v1beta1
kind: InferenceService
metadata:
  name: qwen2
  namespace: fy-1
spec:
  predictor:
    annotations:
      autoscaling.knative.dev/scale-to-zero-pod-retention-period: "1m5s"
    ...

方法二:使用全局 ConfigMap

knative-serving 命名空间下的 config-autoscaler ConfigMap 中,将 scale-to-zero-pod-retention-period 的值修改为非负时长字符串,如 "1m5s"

apiVersion: v1
kind: ConfigMap
metadata:
  annotations:
    "helm.sh/resource-policy": keep
  name: config-autoscaler
  namespace: knative-serving
data:
  scale-to-zero-pod-retention-period: "1m5s"
  1. 请确保该注解存在,否则您的配置将被恢复为默认值。

配置缩容到零的宽限期

此设置在流量停止后,移除最后一个副本前增加延迟,确保 activator/路由路径准备就绪,避免在缩容到零的过渡期间请求丢失。

TIP

仅当您遇到因服务缩容到零导致请求丢失时,才建议调整此值。它不影响无流量时最后一个副本的保留时间,也不保证副本在此期间一定被保留。

方法:使用全局 ConfigMap

knative-serving 命名空间下的 config-autoscaler ConfigMap 中,将 scale-to-zero-grace-period 的值修改为时长字符串,如 "40s"

apiVersion: v1
kind: ConfigMap
metadata:
  annotations:
    "helm.sh/resource-policy": keep
  name: config-autoscaler
  namespace: knative-serving
data:
  scale-to-zero-grace-period: "40s"
  1. 请确保该注解存在,否则您的配置将被恢复为默认值。

扩容配置

本节介绍如何配置推理服务根据流量增加自动扩容。

配置并发阈值

并发数决定每个应用副本能同时处理的请求数。您可以设置软限制或硬限制。

  • 软限制:目标限制,流量激增时可暂时超出,但会触发自动扩缩容以维持目标值。默认值为 100
  • 硬限制:严格上限,当并发达到该值时,超出请求将被缓冲排队。默认值为 0,表示无限制。
WARNING

如果同时指定软限制和硬限制,将使用两者中较小的值,防止自动扩缩容器的目标值超过硬限制。

您可以选择为单个服务配置,或修改全局 ConfigMap 使该设置对所有服务生效。

方法一:使用 InferenceService 资源参数

  • 软限制:在 spec.predictor 中设置 scaleTarget,并将 scaleMetric 设置为 concurrency

  • 硬限制:在 spec.predictor 中设置 containerConcurrency

    # 设置软限制和硬限制
    apiVersion: serving.kserve.io/v1beta1
    kind: InferenceService
    metadata:
      name: demo
      namespace: demo-space
    spec:
      predictor:
        scaleTarget: 200
        scaleMetric: concurrency
        containerConcurrency: 50
        ...

方法二:使用全局 ConfigMap

  • 软限制:在 config-autoscaler ConfigMap 中设置 container-concurrency-target-default
  • 硬限制:无全局设置,因为它影响请求缓冲和排队。

目标利用率百分比

该值指定自动扩缩容器在 metric=concurrency 时的目标百分比,允许在达到硬限制前主动扩容。默认值:70 使用 RPS 时不适用。

方法一:使用 InferenceService 注解

InferenceServicespec.predictor.annotations 中添加 autoscaling.knative.dev/target-utilization-percentage 注解。

# 按服务设置目标利用率
apiVersion: serving.kserve.io/v1beta1
kind: InferenceService
metadata:
  name: qwen2
  namespace: fy-1
spec:
  predictor:
    annotations:
      autoscaling.knative.dev/target-utilization-percentage: "80"

方法二:使用全局 ConfigMap

config-autoscaler ConfigMap 中设置 container-concurrency-target-percentage

apiVersion: v1
kind: ConfigMap
metadata:
  annotations:
    "helm.sh/resource-policy": keep
  name: config-autoscaler
  namespace: knative-serving
data:
  container-concurrency-target-percentage: "80"
  1. 请确保该注解存在,否则您的配置将被恢复为默认值。

配置每秒请求数(RPS)目标

您可以将扩缩容指标从并发数切换为每秒请求数(RPS)。默认值为 200 注意:RPS 模式下不使用并发目标百分比设置。

方法一:使用 InferenceService 资源参数

spec.predictor 中设置 scaleTarget,并将 scaleMetric 设置为 rps

# 按服务设置 RPS 目标
apiVersion: serving.kserve.io/v1beta1
kind: InferenceService
metadata:
  name: qwen2
  namespace: fy-1
spec:
  predictor:
    scaleTarget: 150
    scaleMetric: rps
    ...

方法二:使用全局 ConfigMap

config-autoscaler ConfigMap 中设置 requests-per-second-target-default

apiVersion: v1
kind: ConfigMap
metadata:
  annotations:
    "helm.sh/resource-policy": keep
  name: config-autoscaler
  namespace: knative-serving
data:
  requests-per-second-target-default: "200"
  1. 请确保该注解存在,否则您的配置将被恢复为默认值。