使用 Google Kubernetes Engine (GKE) 在 GPU 上为 LLM 工作负载配置自动扩缩


本页面介绍如何使用 GKE Pod 横向自动扩缩器 (HPA) 设置自动扩缩基础架构,以通过来自 Hugging Face 的文本生成接口 (TGI) 服务框架部署 Gemma 大语言模型 (LLM)。

如需详细了解如何选择自动扩缩指标,请参阅使用 GKE 中的 GPU 自动扩缩 LLM 工作负载的最佳实践

准备工作

在开始之前,请确保您已执行以下任务:

  • 启用 Google Kubernetes Engine API。
  • 启用 Google Kubernetes Engine API
  • 如果您要使用 Google Cloud CLI 执行此任务,请安装初始化 gcloud CLI。 如果您之前安装了 gcloud CLI,请运行 gcloud components update 以获取最新版本。

使用服务器指标进行自动扩缩

您可以使用 TGI 推理服务器发出的特定于工作负载的性能指标来引导 Pod 进行自动扩缩。如需详细了解这些指标,请参阅服务器指标

如需使用服务器指标设置自定义指标自动扩缩,请按以下步骤操作:

  1. 将指标从 TGI 服务器导出到 Cloud Monitoring。您将使用 Google Cloud Managed Service for Prometheus,该功能可简化 Prometheus 收集器的部署和配置。默认情况下,GKE 集群中会启用 Google Cloud Managed Service for Prometheus;您也可以手动启用该功能

    以下示例清单展示了如何设置 PodMonitoring 资源定义,以引导 Google Cloud Managed Service for Prometheus 以 15 秒的周期性间隔从 Pod 爬取指标:

    apiVersion: monitoring.googleapis.com/v1
    kind: PodMonitoring
    metadata:
      name: gemma-pod-monitoring
    spec:
      selector:
        matchLabels:
          app: gemma-server
      endpoints:
      - port: 8000
        interval: 15s
    
  2. 安装自定义指标 Stackdriver 适配器。此适配器可使您导出到 Monitoring 的自定义指标对 HPA 控制器可见。如需了解详情,请参阅 Google Cloud Managed Service for Prometheus 文档中的 Pod 横向自动扩缩

    以下示例命令展示了如何安装该适配器:

    kubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/k8s-stackdriver/master/custom-metrics-stackdriver-adapter/deploy/production/adapter_new_resource_model.yaml
    
  3. 设置基于自定义指标的 HPA 资源。部署基于您的首选自定义指标的 HPA 资源。如需了解详情,请参阅 Google Cloud Managed Service for Prometheus 文档中的 Pod 横向自动扩缩

    选择一个标签页可查看有关如何在清单中配置 HorizontalPodAutoscaler 资源的示例:

    队列大小

    此示例使用 tgi_queue_size TGI 服务器指标,该指标表示队列中的请求数量。

    如需为 HPA 确定合适的队列大小阈值,请参阅使用 GPU 自动扩缩 LLM 推理工作负载的最佳实践

    apiVersion: autoscaling/v2
    kind: HorizontalPodAutoscaler
    metadata:
      name: gemma-server
    spec:
      scaleTargetRef:
        apiVersion: apps/v1
        kind: Deployment
        name: tgi-gemma-deployment
      minReplicas: 1
      maxReplicas: 5
      metrics:
      - type: Pods
        pods:
          metric:
            name: prometheus.googleapis.com|tgi_queue_size|gauge
          target:
            type: AverageValue
            averageValue:  $HPA_AVERAGEVALUE_TARGET
    

    批次大小

    此示例使用 tgi_batch_size TGI 服务器指标,该指标表示当前批次中的请求数量。

    如需为 HPA 确定合适的批次大小阈值,请参阅使用 GPU 自动扩缩 LLM 推理工作负载的最佳实践

    apiVersion: autoscaling/v2
    kind: HorizontalPodAutoscaler
    metadata:
      name: gemma-server
    spec:
      scaleTargetRef:
        apiVersion: apps/v1
        kind: Deployment
        name: tgi-gemma-deployment
      minReplicas: 1
      maxReplicas: 5
      metrics:
      - type: Pods
        pods:
          metric:
            name: prometheus.googleapis.com|tgi_batch_current_size|gauge
          target:
            type: AverageValue
            averageValue:  $HPA_AVERAGEVALUE_TARGET
    

使用 GPU 指标进行自动扩缩

您可以使用 GPU 发出的使用情况和性能指标来引导 Pod 进行自动扩缩。如需详细了解这些指标,请参阅 GPU 指标

如需使用 GPU 指标设置自定义指标自动扩缩,请按以下步骤操作:

  1. 将 GPU 指标导出到 Cloud Monitoring。如果您的 GKE 集群启用了系统指标,它会每 60 秒通过 container/accelerator/duty_cycle 系统指标自动将 GPU 利用率指标发送到 Cloud Monitoring。

    以下示例清单展示了如何设置 PodMonitoring 资源定义,以从 NVIDIA DCGM 工作负载注入指标:

    apiVersion: monitoring.googleapis.com/v1
    kind: PodMonitoring
    metadata:
      name: nvidia-dcgm-exporter-for-hpa
      namespace: gmp-public
      labels:
        app.kubernetes.io/name: nvidia-dcgm-exporter
        app.kubernetes.io/part-of: google-cloud-managed-prometheus
    spec:
      selector:
        matchLabels:
          app.kubernetes.io/name: nvidia-dcgm-exporter
      endpoints:
        - port: metrics
          interval: 15s
          metricRelabeling:
            - action: keep
              sourceLabels: [__name__]
            - action: replace
              sourceLabels: [__name__]
              targetLabel: __name__
              regex: DCGM_FI_DEV_GPU_UTIL
              replacement: dcgm_fi_dev_gpu_util
    

    在代码中,请确保将 HPA 中使用的 DCGM 指标名称更改为小写。这是因为存在一个已知问题,即 HPA 不适用于大写的外部指标名称。

  2. 安装自定义指标 Stackdriver 适配器。此适配器可使您导出到 Monitoring 的自定义指标对 HPA 控制器可见。如需了解详情,请参阅 Google Cloud Managed Service for Prometheus 文档中的 Pod 横向自动扩缩

    以下示例命令展示了如何执行此安装:

    kubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/k8s-stackdriver/master/custom-metrics-stackdriver-adapter/deploy/production/adapter_new_resource_model.yaml
    
  3. 设置基于自定义指标的 HPA 资源。部署基于您的首选自定义指标的 HPA 资源。如需了解详情,请参阅 Google Cloud Managed Service for Prometheus 文档中的 Pod 横向自动扩缩

    • 确定 HPA 的平均值目标以触发自动扩缩。您可以通过实验方式执行此操作;例如,在服务器上生成不断增加的负载,并观察 GPU 利用率达到峰值的位置。请注意 HPA 容忍,这默认为目标值周围的 0.1 无操作范围,用于抑制振荡。
    • 我们建议使用 locust-load-inference 工具进行测试。您还可以创建 Cloud Monitoring 自定义信息中心来直观呈现指标行为。

    选择一个标签页可查看有关如何在清单中配置 HorizontalPodAutoscaler 资源的示例:

    工作周期(GKE 系统)

    apiVersion: autoscaling/v2
    kind: HorizontalPodAutoscaler
    metadata:
      name: gemma-hpa
    spec:
      scaleTargetRef:
        apiVersion: apps/v1
        kind: Deployment
        name: tgi-gemma-deployment
      minReplicas: 1
      maxReplicas: 5
      metrics:
      - type: External
        external:
          metric:
            name: kubernetes.io|container|accelerator|duty_cycle
            selector:
              matchLabels:
                resource.labels.container_name: inference-server
                resource.labels.namespace_name: default
          target:
            type: AverageValue
            averageValue:  $HPA_AVERAGEVALUE_TARGET
    

    工作周期 (DCGM)

    apiVersion: autoscaling/v2
    kind: HorizontalPodAutoscaler
    metadata:
      name: gemma-hpa
    spec:
      scaleTargetRef:
        apiVersion: apps/v1
        kind: Deployment
        name: tgi-gemma-deployment
      minReplicas: 1
      maxReplicas: 5
      metrics:
      - type: External
        external:
          metric:
            name: prometheus.googleapis.com|dcgm_fi_dev_gpu_util|unknown
            selector:
              matchLabels:
                metric.labels.exported_container: inference-server
                metric.labels.exported_namespace: default
          target:
            type: AverageValue
            averageValue:  $HPA_AVERAGEVALUE_TARGET
    

后续步骤