2.16. 监控模型性能
在单型号服务平台中,您可以查看平台上部署的特定模型的性能指标。
2.16.1. 查看已部署模型的性能指标 复制链接链接已复制到粘贴板!
您可以监控以下指标,以了解在单型号服务平台上部署的特定模型:
- 请求数 - 特定模型失败的请求数。
- 平均响应时间(ms)- 对请求做出特定模型的平均时间。
- CPU 使用率(%) -特定模型当前使用的每个模型副本的 CPU 限值百分比。
- 内存使用率(%) -特定模型使用的每个模型副本的内存限值百分比。
您可以为这些指标指定时间范围和刷新间隔,例如,当峰值使用小时以及模型在指定时间执行的方式时。
先决条件
- 已安装 Red Hat OpenShift AI。
- 集群管理员为 OpenShift 集群上的用户定义的项目启用了用户工作负载监控(UWM)。如需更多信息,请参阅 为用户定义的项目启用监控,以及为 单模式服务平台配置监控。
- 您已登陆到 Red Hat OpenShift AI。
-
如果您使用 OpenShift AI 组,则作为 OpenShift 中的用户组或 admin 组(如
rhoai-users或rhoai-admins)的一部分。 以下仪表板配置选项被设置为默认值,如下所示:
disablePerformanceMetrics:false disableKServeMetrics:false有关设置仪表板配置选项的更多信息,请参阅 自定义仪表板。
已使用预安装的运行时在单模式服务平台上部署了模型。
注意只有在使用预安装模型服务运行时或从预安装运行时重复的自定义运行时,指标只支持部署模型。
流程
在 OpenShift AI 仪表板导航菜单中点 Data Science projects。
Data Science 项目页将打开。
- 点击包含您要监控的数据科学模型的项目名称。
- 在项目详情页面中,点 Models 选项卡。
- 选择您感兴趣的模型。
在 Endpoint performance 选项卡中,设置以下选项:
- 时间范围 -指定跟踪指标的时长。您可以选择其中一个值:1 小时、24 小时、7 天和 30 天。
- 刷新 interval - 指定指标页面中图形的频率(显示最新的数据)。您可以选择以下值之一:15 秒、30 秒、1 分钟、5 分钟、15 分钟、30 分钟、1 小时、2 小时和 1 天。
- 向下滚动以查看请求数、平均响应时间、CPU 使用率和内存使用率的数据图形。
验证
Endpoint 性能 选项卡显示模型的指标图。
2.16.2. 部署 Grafana 指标仪表板 复制链接链接已复制到粘贴板!
您可以为用户工作负载监控(UWM)部署 Grafana 指标仪表板,以监控单模型服务平台上部署的模型的性能和资源使用指标。
您可以创建 Kustomize 覆盖,如下例所示。使用覆盖为通过 OpenVino Model Server (OVMS)和 vLLM 部署的模型部署预配置指标仪表板。
先决条件
- 具有 OpenShift 集群的集群 admin 特权。
- 集群管理员为 OpenShift 集群上的用户定义的项目启用了用户工作负载监控(UWM)。如需更多信息,请参阅 为用户定义的项目启用监控,以及为 单模式服务平台配置监控。
- 已安装 OpenShift 命令行界面(CLI)。如需更多信息 ,请参阅安装 OpenShift CLI。
您已创建了覆盖来部署 Grafana 实例,如下例所示。
注意要查看 GPU 指标,您必须启用 NVIDIA GPU 监控仪表板,如 启用 GPU 监控仪表板 中所述。GPU 监控仪表板提供对 GPU 使用率、内存用量和其他 GPU 节点的指标的全面视图。
流程
- 在终端窗口中,以集群管理员身份登录 OpenShift CLI。
- 如果您还没有创建覆盖来安装 Grafana operator 和指标仪表板,请参阅 RHOAI UWM 存储库 来创建它。
使用您创建的覆盖在 OpenShift 集群上安装 Grafana 实例和指标仪表板。将
<overlay-name> 替换为覆盖的名称。oc apply -k overlays/<overlay-name>检索 Grafana 实例的 URL。将
<namespace> 替换为包含 Grafana 实例的命名空间。oc get route -n <namespace> grafana-route -o jsonpath='{.spec.host}'您会看到类似以下示例的输出。使用 URL 访问 Grafana 实例:
grafana-<namespace>.apps.example-openshift.com
验证
- 您可以访问 Grafana 实例上 KServe、vLLM 和 OVMS 的预配置仪表板。
2.16.3. 在 Grafana 实例上部署 vLLM/GPU 指标仪表板 复制链接链接已复制到粘贴板!
部署 Grafana 板以监控加速器和 vLLM 性能指标。
先决条件
- 您已部署了 Grafana 指标仪表板,如 部署 Grafana 指标仪表板 中所述。
- 您可以访问 Grafana 实例。
-
您已安装了
envsubst,这是用于替换配置文件中的环境变量的命令行工具。如需更多信息,请参阅 GNUgettext文档。
流程
在
YAML文件中定义 GrafanaDashboard 对象,如下例所示:-
要监控加速器指标,请参阅
nvidia-vllm-dashboard.yaml。 -
要监控 vLLM 指标,请参阅
grafana-vllm-dashboard.yaml。
-
要监控加速器指标,请参阅
创建一个类似以下示例的
inputs.env文件。将NAMESPACE和MODEL_NAME参数替换为您自己的值:NAMESPACE=<namespace>1 MODEL_NAME=<model-name>2 通过执行以下操作,将 YAML 文件中的
NAMESPACE和MODEL_NAME参数替换为input.env文件中的值:将
inputs.env中所述的参数导出为环境变量:export $(cat inputs.env | xargs)将 YAML 文件中的
$NAMESPACE和${MODEL_NAME)变量替换为导出的环境变量的值:envsubst '${NAMESPACE} ${MODEL_NAME}' < nvidia-vllm-dashboard.yaml > nvidia-vllm-dashboard-replaced.yaml
- 确认 YAML 文件包含更新的值。
部署仪表板对象:
oc create -f nvidia-vllm-dashboard-replaced.yaml
验证
您可以在 Grafana 实例上看到加速器和 vLLM 指标仪表板。
2.16.4. Grafana 指标 复制链接链接已复制到粘贴板!
您可以使用 Grafana 板来监控加速器和 vLLM 性能指标。数据源、instance 和 gpu 是板内定义的变量。
2.16.4.1. 加速器指标 复制链接链接已复制到粘贴板!
跟踪加速器的指标,以确保硬件的健康状况。
- NVIDIA GPU 使用率
跟踪 GPU 主动处理任务的时间百分比,指示 GPU 工作负载级别。
查询
DCGM_FI_DEV_GPU_UTIL{instance=~"$instance", gpu=~"$gpu"}
- NVIDIA GPU 内存使用率
将内存用量与可用内存进行比较,这对于识别 GPU 密集型工作负载中的内存瓶颈至关重要。
查询
DCGM_FI_DEV_POWER_USAGE{instance=~"$instance", gpu=~"$gpu"}
sum
sum(DCGM_FI_DEV_POWER_USAGE{instance=~"$instance", gpu=~"$gpu"})
- NVIDIA GPU 温度
确保 GPU 在安全限制内运行,以防止硬件降级。
查询
DCGM_FI_DEV_GPU_TEMP{instance=~"$instance", gpu=~"$gpu"}
avg
avg(DCGM_FI_DEV_GPU_TEMP{instance=~"$instance", gpu=~"$gpu"})
- NVIDIA GPU 节流
GPU 节流会在 GPU 自动减少时钟时发生,以避免出现过量问题的问题。
您可以访问以下指标来识别 GPU 节流:
- GPU 温度 :监控 GPU 温度。当 GPU 达到特定温度时,节流通常会发生,例如 85-90°C。
- Osm clock speed: 监控核心时钟速度。当 GPU 处于 load 表示节流时,时钟速度显著下降。
2.16.4.2. CPU 指标 复制链接链接已复制到粘贴板!
您可以跟踪 CPU 上的指标,以确保硬件的健康状况。
- CPU 使用率
跟踪 CPU 使用量以识别 CPU 密集型工作负载。
查询
sum(rate(container_cpu_usage_seconds_total{namespace="$namespace", pod=~"$model_name.*"}[5m])) by (namespace)
- CPU-GPU 瓶颈
CPU 节流和 GPU 使用指标的组合来识别资源分配无效。下表概述了 CPU 节流和 GPU 利用率的组合,以及您的环境的含义:
| CPU 节流 | GPU 使用率 | 含义 |
|---|---|---|
| 低 | High | 系统经过平衡。在没有 CPU 约束的情况下,会完全使用 GPU。 |
| High | 低 | CPU 资源受限制。CPU 无法跟上 GPU 的处理需求,并且 GPU 可能被使用。 |
| High | High | CPU 和 GPU 的工作负载正在增加,您可能需要扩展资源。 |
查询
sum(rate(container_cpu_cfs_throttled_seconds_total{namespace="$namespace", pod=~"$model_name.*"}[5m])) by (namespace)
avg_over_time(DCGM_FI_DEV_GPU_UTIL{instance=~"$instance", gpu=~"$gpu"}[5m])
2.16.4.3. vLLM 指标 复制链接链接已复制到粘贴板!
您可以跟踪与 vLLM 模型相关的指标。
- GPU 和 CPU 缓存使用率
跟踪 vLLM 模型使用的 GPU 内存百分比,提供有关内存效率的见解。
查询
sum_over_time(vllm:gpu_cache_usage_perc{namespace="${namespace}",pod=~"$model_name.*"}[24h])
- 运行请求
主动处理的请求数。帮助监控工作负载并发。
num_requests_running{namespace="$namespace", pod=~"$model_name.*"}
- 等待请求
跟踪队列中的请求,表示系统饱和。
num_requests_waiting{namespace="$namespace", pod=~"$model_name.*"}
- 前缀缓存命中率
高命中率意味着有效地重复使用缓存的计算,从而优化资源使用量。
查询
vllm:gpu_cache_usage_perc{namespace="$namespace", pod=~"$model_name.*", model_name="$model_name"}
vllm:cpu_cache_usage_perc{namespace="$namespace", pod=~"$model_name.*", model_name="$model_name"}
- 请求总数
查询
vllm:request_success_total{finished_reason="length",namespace="$namespace", pod=~"$model_name.*", model_name="$model_name"}
请求终止,因为它达到模型 inference 设置的最大令牌限制。
查询
vllm:request_success_total{finished_reason="stop",namespace="$namespace", pod=~"$model_name.*", model_name="$model_name"}
请求根据模型的输出或停止条件而自然完成,例如,句子或令牌完成结束。
- 端到端延迟
- 测量处理请求以获得最佳用户体验的总体时间。
直方查询
histogram_quantile(0.99, sum by(le) (rate(vllm:e2e_request_latency_seconds_bucket{namespace="$namespace", pod=~"$model_name.*", model_name="$model_name"}[5m])))
histogram_quantile(0.95, sum by(le) (rate(vllm:e2e_request_latency_seconds_bucket{namespace="$namespace", pod=~"$model_name.*", model_name="$model_name"}[5m])))
histogram_quantile(0.9, sum by(le) (rate(vllm:e2e_request_latency_seconds_bucket{namespace="$namespace", pod=~"$model_name.*", model_name="$model_name"}[5m])))
histogram_quantile(0.5, sum by(le) (rate(vllm:e2e_request_latency_seconds_bucket{namespace="$namespace", pod=~"$model_name.*", model_name="$model_name"}[5m])))
rate(vllm:e2e_request_latency_seconds_sum{namespace="$namespace", pod=~"$model_name.*",model_name="$model_name"}[5m])
rate(vllm:e2e_request_latency_seconds_count{namespace="$namespace", pod=~"$model_name.*", model_name="$model_name"}[5m])
- 第一次令牌(TTFT)延迟的时间
在响应中生成第一个令牌所需的时间。
直方查询
histogram_quantile(0.99, sum by(le) (rate(vllm:time_to_first_token_seconds_bucket{namespace="$namespace", pod=~"$model_name.*", model_name="$model_name"}[5m])))
histogram_quantile(0.95, sum by(le) (rate(vllm:time_to_first_token_seconds_bucket{namespace="$namespace", pod=~"$model_name.*", model_name="$model_name"}[5m])))
histogram_quantile(0.9, sum by(le) (rate(vllm:time_to_first_token_seconds_bucket{namespace="$namespace", pod=~"$model_name.*", model_name="$model_name"}[5m])))
histogram_quantile(0.5, sum by(le) (rate(vllm:time_to_first_token_seconds_bucket{namespace="$namespace", pod=~"$model_name.*", model_name="$model_name"}[5m])))
rate(vllm:time_to_first_token_seconds_sum{namespace="$namespace", pod=~"$model_name.*", model_name="$model_name"}[5m])
rate(vllm:time_to_first_token_seconds_count{namespace="$namespace", pod=~"$model_name.*", model_name="$model_name"}[5m])
- 每个输出令牌(TPOT)延迟的时间
生成每个输出令牌的平均时间。
直方查询
histogram_quantile(0.99, sum by(le) (rate(vllm:time_per_output_token_seconds_bucket{namespace="$namespace", pod=~"$model_name.*", model_name="$model_name"}[5m])))
histogram_quantile(0.95, sum by(le) (rate(vllm:time_per_output_token_seconds_bucket{namespace="$namespace", pod=~"$model_name.*", model_name="$model_name"}[5m])))
histogram_quantile(0.9, sum by(le) (rate(vllm:time_per_output_token_seconds_bucket{namespace="$namespace", pod=~"$model_name.*", model_name="$model_name"}[5m])))
histogram_quantile(0.5, sum by(le) (rate(vllm:time_per_output_token_seconds_bucket{namespace="$namespace", pod=~"$model_name.*", model_name="$model_name"}[5m])))
rate(vllm:time_per_output_token_seconds_sum{namespace="$namespace", pod=~"$model_name.*", model_name="$model_name"}[5m])
rate(vllm:time_per_output_token_seconds_count{namespace="$namespace", pod=~"$model_name.*", model_name="$model_name"}[5m])
- 提示令牌吞吐量和生成吞吐量
跟踪处理提示令牌的速度,以进行 LLM 优化。
查询
rate(vllm:prompt_tokens_total{namespace="$namespace", pod=~"$model_name.*", model_name="$model_name"}[5m])
rate(vllm:generation_tokens_total{namespace="$namespace", pod=~"$model_name.*", model_name="$model_name"}[5m])
- 生成的令牌总数
- 测量生成响应令牌的效率,对于实时应用至关重要。
查询
sum(vllm:generation_tokens_total{namespace="$namespace", pod=~"$model_name.*", model_name="$model_name"})