AI 系统里最贵的故障不是崩溃,是静默降级。崩溃会留下堆栈,静默降级什么都不留——它只是慢慢地、安静地,不再做它该做的事。
我遇到过三种形态,每一种都真实发生过:
一、装了 GPU 版,实际跑在 CPU 上
onnxruntime-gpu 装好了,import 也不报错,但运行时找不到 libcublasLt.so —— 它就悄悄退回 CPU provider。程序照常出结果,只是慢了几倍。没有任何日志级别能告诉你这件事,除非你主动去问。
二、配置项写对了,实际没生效
解码后端配置成硬件加速,但那条规则在非特定硬件的机器上不适用,于是运行时自动回落到 CPU 软解。配置文件是对的,行为是错的——配置项描述的是意图,不是事实。
三、最危险的一种:失败被当成了"没有目标"
推理 SDK 在设备异常时只记日志、返回空值,不抛异常。下游把空值解析成"这一帧没有检测到目标",于是:
设备故障与"画面里真的没人",在数据库里长得完全一样。
告警系统不会响,因为从数据看一切正常。直到有人问"为什么这个摄像头一整天都没有事件"。
收口方式
三处调用点全部改成失败即抛异常,由上层统一落成"任务错误"状态;启动阶段增加一次实际生效值自检,拿不到加速就拒绝启动而不是默默降级。
更重要的是一条排查铁律:别信配置项,查实际生效的值。资源巡检日志、模型加载日志、解码器选择日志——这些运行时事实才是唯一可信的证据。