Serverless GPU 稳定性验证与故障记录
说明如何用 Prometheus、DCGM Exporter 与 MLPerf 建立 Serverless GPU 稳定性验证链路,并按告警状态、请求延迟和 worker 计费阶段形成可复盘的故障记录。
Serverless GPU 的稳定性验证,应把持续指标、请求延迟、告警状态和 worker 生命周期放在同一条时间线上;故障记录不能只抄一条报错,还要保存配置版本、状态变化与恢复动作。使用算力租赁时,应把 worker 启动、执行和空闲等待分别标记,因为 RunPod 的 Serverless 计费说明 将可计费时间按这些阶段说明,并从 worker 启动计到完全停止、向上取整到秒。
Serverless GPU:先固定被测边界
先记录 provider、GPU 型号、模型与运行时版本、部署 revision、请求形态和并发入口。构造持续推理任务时,还要写清请求如何到达、任务在什么条件下结束、用什么指标判断运行正常,避免恢复后无法确认变化发生在哪一层。
按 MLPerf Inference 规则,system under test 是接受性能测量的软硬件资源集合;对 LLM,它分别记录首 token 延迟 TTFT 和每个输出 token 的平均间隔 TPOT。同一规则对不同场景采用不同负载与结果指标:
- Server:按 Poisson 分布发送查询,在场景规定的延迟约束下记录可支持的最大 Poisson 吞吐量。
- Offline:开始时用一个查询发送全部样本,不设延迟约束,指标是吞吐量。
- Single stream:上一请求完成后再发送下一请求,指标是 P90 延迟估计。
选择与实际请求方式对应的场景后,后续运行才具有可重复的比较基础。
稳定性验证:先确认指标链路
按 Prometheus 入门文档,可使用以下命令启动,数据库默认位于 ./data:
./prometheus --config.file=prometheus.yml
入门配置在 global.scrape_interval 中设置采集间隔,并在 scrape_configs 下通过 job_name 和 static_configs.targets 列出目标;job 可以覆盖全局间隔:
global:
scrape_interval: 15s
scrape_configs:
- job_name: 'prometheus'
static_configs:
- targets: ['localhost:9090']
对于已运行的 DCGM Exporter,NVIDIA 文档说明它默认监听 :9400,通过 /metrics 暴露 GPU 指标,采集间隔默认是 30000 ms。先检查端点:
curl localhost:9400/metrics
再在相应 Prometheus job 的 static_configs.targets 中登记 Exporter 的 HTTP 服务地址。端点可访问只代表采集入口可用,不能单独证明 GPU 或推理服务正常。
稳定性验证:用延迟观察持续运行
Prometheus 查询函数文档给出了按 job 计算 classic histogram P90 的示例:
histogram_quantile(0.9, sum by (job, le) (rate(http_request_duration_seconds_bucket[10m])))
只有服务实际暴露对应 histogram 时才能直接使用该指标名,否则应换成真实 series。classic histogram 聚合时必须保留 le,因此不要从 by (job, le) 中删除它。每次验证还应保存完整 PromQL、查询时间和 job,避免恢复后只留下一个无法复算的延迟数字。
故障记录:关联告警、请求与恢复
按 Prometheus 告警规则,告警条件为真但 for 尚未满足时处于 pending;keep_firing_for 会在条件清除后继续维持 firing。活动告警会出现在合成时间序列 ALERTS 中,并通过 alertstate 区分状态。
每个故障至少记录以下内容:
- 条件首次为真、进入
pending、进入firing、条件清除、告警结束和恢复验证的时间。 - 故障编号、部署 revision、endpoint、Prometheus job、worker 或 request 标识。
- 对应 P90 查询、原始告警标签、请求错误类别,以及每次操作的执行人和结果。
- worker 启动、停止及空闲等待时间,便于与运行记录和账单核对。
保留原始时间戳和查询结果,不要只保存汇总结论;保留期写入内部记录策略即可,本文不替你设定天数。采集失败只能证明观测链路中断,P90 上升与请求报错同时出现也只是关联现象,不能直接写成 GPU 故障根因。
算力租赁:把计费阶段放进时间线
RunPod 的计费规则把 worker 时间分为容器初始化与模型加载所对应的启动阶段、请求执行阶段,以及完成请求后等待缩机的空闲超时阶段。请求完成时间不能直接当作 worker 停止时间。
可按账单或控制台时间戳计算:
单个 worker 计费秒数 = 向上取整(YOUR_STOP_TIME - YOUR_START_TIME)
核对总额 = 各 worker 计费秒数之和
逐个核对启动、模型加载、执行和空闲等待记录。金额不要仅由运行时长猜测,应以 provider 当前账单或报价中的实际行项目为准;其他平台则查阅各自的当前计费文档。
常见出错点
- P90 查询没有结果:先确认服务暴露的 metric 类型和名称;使用 classic histogram 时检查
le是否仍在by中。 curl localhost:9400/metrics无输出:先区分 Exporter、采集入口与目标配置问题,不要直接记录为 GPU 故障。ALERTS已活跃但没有进入firing:检查条件是否满足以及for是否已经经过。- 账单与运行记录对不上:按启动、执行和空闲阶段分别核对,不要只比较请求开始与结束时间。
本文步骤依据正文所链接的官方文档编写,未包含运行或测量;使用前应对照当前版本复核。