用Ray观测和监控大语言模型工作负载 原创

发布于 2025-1-27 08:20
浏览
0收藏

前言

GPT-4、PHI2、BERT和T5等大语言模型(LLM)的出现已彻底改变了自然语言处理,这些模型支持高端应用程序,包括聊天机器人、推荐系统和分析。然而,LLM中工作负载的规模和复杂性使得保证性能和可靠性成了一大挑战。在这种情况下,在使用Ray等框架部署工作负载的同时进行监控和观测显得非常必要。

Ray是一种分布式计算框架,提供了一个强大的平台,可以跨集群有效地扩展LLM工作负载。因此,它成了托管、管理和观测LLM的一种出色选择。利用Ray的内置特性,并结合Prometheus和Grafana观测关键度量指标,将帮助用户有效地监控、优化资源的使用,并快速诊断生产环境中的问题。

本文探讨了Ray托管的LLM工作负载中可观测性的重要性、需要监控的关键度量指标以及使用Prometheus和Grafana搭建可观测性机制的详细指南。

为什么使用Ray处理LLM工作负载?

Ray为分布式、可扩展的应用程序设计,因而成为了托管和管理LLM工作负载的理想选择。让Ray成为出色选择的主要特性包括如下:

  • 动态任务调度:Ray的细粒度任务调度确保了资源的有效利用,特别是在处理LLM推理任务时,这类任务的大小和复杂性可能大有不同。
  • 易于集成:Ray与Hugging Face Transformers等框架无缝集成,可以轻松部署预训练的LLM。
  • 自动扩展:Ray的集群自动扩展器可以根据工作负载的需求动态调整资源,确保成本效益和可扩展性。
  • 可观测性支持:Ray提供了与Prometheus兼容的度量指标端点,简化了分布式系统的监控设置。

这些特性使Ray不仅是一种计算框架,还是用于在实际应用程序中运行、监控和扩展LLM的基础工具。

观测Ray托管的LLM工作负载的关键指标

为了确保Ray托管的LLM工作负载的顺利运行,跟踪一系列性能、资源利用和操作度量指标就至关重要。以下是主要类别:

性能指标

  • 任务延迟:测量单个Ray任务完成所需的时间,这对于识别推理管道中的瓶颈至关重要。
  • 吞吐量:跟踪每秒完成的任务数量,反映了系统处理高请求量的能力。
  • 词元处理速率:测量每秒处理的词元数量,特别是与GPT-4等基于Transformer的模型相关。

资源利用指标

  • CPU和GPU利用率:监控整个集群的资源使用情况,确保工作负载的高效分配。
  • 内存使用:跟踪内存消耗以防止内存不足错误,这对于托管大型模型尤其重要。
  • 对象存储利用率:观测Ray的内存中对象存储的使用情况,以便跨任务有效地共享数据。

操作指标

错误率:监控任务失败率,以快速检测和解决问题。

节点可用性:跟踪Ray集群中节点的运行状况,确保可靠性。

队列长度:衡量挂起任务的数量,表明处理过程中的潜在瓶颈。

为Ray托管的工作负载设置可观测性机制

Ray中的可观测性需要使用度量指标来了解系统性能和诊断问题。通过将Ray与Prometheus和Grafana相集成,你就可以深入了解工作负载的行为。

第1步:设置Prometheus监控

Prometheus是一个开源监控系统,可以从Ray的端点收集度量指标。按照下面的指南在Kubernetes上搭建Prometheus和Ray。

使用KubeRay安装Prometheus:

# Path: kuberay/
./install/prometheus/install.sh

# Check the installation
kubectl get all -n prometheus-system

配置Pod和服务监控器

设置PodMonitor和ServiceMonitor资源,从Ray head节点和worker节点中抓取度量指标:

apiVersion: monitoring.coreos.com/v1
kind: PodMonitor
metadata:
  name: ray-workers-monitor
  namespace: prometheus-system
  labels:
    release: prometheus
    ray.io/cluster: rayservice-sample-raycluster-bpkgv
spec:
  jobLabel: ray-workers
  namespaceSelector:
    matchNames:
      - raysvc
  selector:
    matchLabels:
      ray.io/node-type: worker
  podMetricsEndpoints:
    - port: metrics
---
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
  name: resume-analyzer-monitor
  namespace: prometheus-system
  labels:
    release: prometheus
spec:
  jobLabel: resume-analyzer
  namespaceSelector:
    matchNames:
      - raysvc
  selector:
    matchLabels:
      ray.io/node-type: head
    endpoints:
      - port: metrics
    targetLabels:
      - ray.io/cluster

第2步:配置录制规则

录制规则允许你预先计算PromQL表达式,以加快查询。比如说,计算Ray全局控制存储(GCS)的可用性:

apiVersion: monitoring.coreos.com/v1
kind: PrometheusRule
metadata:
  name: ray-cluster-gcs-rules
  namespace: prometheus-system
  labels:
    release: prometheus
spec:
  groups:
  - name: ray-cluster-main-staging-gcs.rules
    interval: 30s
    rules:
    - record: ray_gcs_availability_30d
      expr: |
        (
          100 * (
            sum(rate(ray_gcs_update_resource_usage_time_bucket{container="ray-head", le="20.0"}[30d]))
            /
            sum(rate(ray_gcs_update_resource_usage_time_count{container="ray-head"}[30d]))
          )
        )

表达方式解释:

  • ray_gcs_update_resource_usage_time_bucket:跟踪资源使用更新的延迟时间。
  • ray_gcs_update_resource_usage_time_count:统计更新总次数。
  • 该表达式计算过去30天内在特定延迟阈值内完成的更新的百分比。

第3步:设置警报规则

警报规则有助于主动识别问题。比如说,检测缺失的GCS度量指标:

apiVersion: monitoring.coreos.com/v1
kind: PrometheusRule
metadata:
  name: ray-cluster-gcs-rules
  namespace: prometheus-system
  labels:
    release: prometheus
spec:
  groups:
  - name: ray-cluster-main-staging-gcs.rules
    interval: 30s
    rules:
    - alert: MissingMetricRayGlobalControlStore
      expr: |
        absent(ray_gcs_update_resource_usage_time_count)
      for: 1m
      labels:
        severity: warning
      annotations:
        summary: "Missing Ray GCS metrics"

设置Grafana仪表板

Grafana为度量指标提供了丰富的可视化。下面介绍了如何为Ray设置仪表板:

第1步:捕获默认仪表板

从Ray head pod中复制默认仪表板:

kubectl cp <head-pod>:/tmp/ray/session_latest/metrics/grafana/dashboards/ ./dashboards

第2步:访问Grafana仪表板

kubectl port-forward deployment/prometheus-grafana -n prometheus-system 3000:3000

默认登录凭据:

  • 用户名:admin
  • 密码:prom-operator

启用Ray Serve Pods中的分析

分析推理工作负载依赖用于监控、调试和优化性能的复杂技术。本节将深入介绍特定的工具、配置和场景,以增强你的分析能力。

•内存分析

内存分析对于内存泄漏检测和使用优化至关重要。比如说,借助Memray,可以跟踪内存分配,并了解推理任务的行为。若要启用Ray Serve Pod中的内存分析,更新容器的安全上下文以允许跟踪:

securityContext:
  capabilities:
    add:
    - SYS_PTRACE

一旦配置完成,Memray就可以用来生成内存使用报告,这有助于识别系统中内存消耗高的任务或瓶颈。

示例用例:

在批处理推理任务期间分析大型Transformer模型的内存使用情况,以优化批处理大小,并减少内存开销。

•CPU分析

针对CPU分析,可以在worker pod中安装gdb、lldb或py-spy等工具,以收集详细的CPU使用数据。这些工具允许你监控哪些函数消耗最多的CPU时间,从而实现有针对性的优化。

设置CPU分析机制:

  • 在ray worker pod中安装gdb或lldb。
  • 使用分析脚本或工具在推理任务期间捕获CPU使用快照。

示例用例:

  • 在预处理管道中识别需要CPU资源的操作,将其卸载到GPU或优化其实现。

端到端分析示例

当你集成内存分析和CPU分析时,这将为你提供系统性能的总体概况。为了更好地说明这一点,考虑一个有延迟峰值的LLM推理任务。如果你把内存分析和CPU分析关联起来,就会发现:

  • 内存使用背后的罪魁祸首是大批的输入数据。
  • CPU瓶颈是由于分词功能效率低下造成的。

如果你优化批处理大小并重构瓶颈函数,性能可能会得到很大程度的提高。

结论

使用Ray的分布式LLM工作负载以及可靠工具的可观测性将确保团队从这些系统中获得性能、可靠性和可扩展性。这篇指南介绍了在Ray上设置和监控LLM工作负载,很实用。适当的可观测性将帮助开发人员和操作人员尽早发现问题,优化资源使用,并进一步改善用户在使用NLP应用程序时获得的体验。

原文标题:​Observing and monitoring Large Language Model workloads with Ray​,作者:Swastik Gour


©著作权归作者所有,如需转载,请注明出处,否则将追究法律责任
已于2025-1-27 08:24:31修改
收藏
回复
举报
回复
相关推荐