搞AI系统稳定性的活儿,这两年越来越难干了。以前做传统后端SRE,核心就一句话:服务别挂、接口别超时、数据别丢。可一旦系统里塞进了模型推理、训练任务、特征工程这些AI组件,情况就彻底变了——你不仅要保证服务在跑,还要保证它跑出来的结果是靠谱的。正因如此,"超级SRE"这个概念开始被反复提起,简单说,就是一批既要懂基础设施、又要懂模型生命周期、还要懂数据质量的综合型稳定性工程师。这篇文章不是教科书,我想以一个实际在一线扛过AI系统稳定性的人的身份,聊聊我眼中的超级SRE到底在做什么、用什么方法做事、以及踩过哪些坑。
我把这套东西拆成几条线来讲:AI稳定性和传统稳定性的本质差异、算力层的硬仗、模型质量的守护、可观测性建设、以及故障排查的实战套路。全程都会穿插真实场景和可以直接抄作业的操作细节,希望能给正在往这个方向转的SRE、或是已经在AI业务里挣扎的运维同行一些参考。如果你是刚接触这个概念,也能从中找到可以立刻用起来的东西。
1. 先搞清楚:AI系统的稳定性和传统系统根本不是一回事
1.1 从"服务不挂"到"结果靠谱"
传统SRE的核心KPI无非是可用性、时延、错误率,整个监控告警体系都是围绕这三个东西在转。但AI系统不一样,它的输出是模型推理出来的结果,这套体系只能覆盖"服务活着"这个层面,覆盖不了"服务活着但答案已经离谱"这个层面。
我打一个比方:传统后端就像一家餐厅,你关心的是后厨有没有按时出餐、餐具干不干净、服务员有没有上错菜。而AI系统相当于后厨里多了一个会根据食材状态自由发挥的AI厨师,他做出来的每一道菜可能都不一样,你得另外盯着"菜的咸淡和配方是不是逐渐跑偏了"这个问题。这就是模型漂移和数据漂移的范畴,传统SRE的告警规则根本不会去检查菜好不好吃。
实际业务里最常见的场景是:某个推荐模型的线上效果从95%的准确率慢慢掉到80%,服务层面一切正常,CPU正常、内存正常、时延正常,但业务方已经炸锅了。你翻遍基础设施面板也找不到原因,因为问题不出在基础设施层,出在模型输入分布和训练分布之间的偏差上。这类问题才是超级SRE区别于传统SRE的核心战场。
1.2 AI系统的失败模式:不只是崩溃
传统系统的故障模式相对收敛:进程崩了、端口挂了、磁盘满了、依赖超时了。AI系统的失败模式要丰富得多,很多坑没有经历过完全想不到:
- 模型还在正常响应,但是特征数据里某个字段因为上游改动变成了空值,推理结果整体失真;
- GPU显存泄漏,进程不崩但OOM越来越频繁,服务通过反复重启维持存活;
- 推理时延随着并发上升呈非线性恶化,因为模型推理对显存带宽的争抢远高于普通计算;
- 训练任务跑到一半遇到节点故障,整个epoch白跑,几个T的数据重新加载;
- 模型发布后发现效果更差了,但因为在灰度期流量比例低,样本量太少导致指标没有触发告警阈值。
这些失败模式在传统SRE体系下要么根本观测不到,要么观测到了也无从下手。所以超级SRE首先要做的事情,是扩展自己的"稳定性边界"——不能只盯P99时延和错误码,还要把模型指标、数据质量、资源效率全部纳入视野。
1.3 传统SRE经验能平移多少
诚实地说,传统SRE的那套方法论——SLO/SLI设计、故障分级、应急预案、事后复盘、容量规划——在AI系统里全部适用,而且非常适用。因为AI系统本质上还是跑在基础设施之上的服务,稳定性工程的基本原则并不会因为加了模型就失效。
但平移的过程中有两个地方需要特别注意:
第一,监控对象必须从"进程"延伸到"模型"。传统SRE盯的是进程的CPU、内存、线程数,超级SRE还得多盯一份:模型输入特征的分布、模型输出分数的分布、以及两者之间的关联变化。这种监控光靠通用的监控系统做不了,得结合数据管道和模型推理框架定制。
第二,故障的"根因分析"从确定性转向概率性。传统系统出问题,90%能定位到一个明确的代码bug、配置错误或资源瓶颈。AI系统出问题,很多情况下没有明确的"错误",只有"效果变差",而"为什么变差"可能涉及训练数据、特征工程、实时数据源、模型版本、外部环境等多个因素,需要一套完全不同的排查方法论。这部分我后面会单独展开讲。
2. 算力层是硬仗:GPU集群治理的实战经验
2.1 GPU故障率比你想象中高得多
很多人刚接触AI基础设施时最不适应的一点,就是GPU器件的高故障率。在CPU主导的传统集群里,"硬件坏了"是小概率事件,基本靠备机和自动重启就能兜住。但到了GPU集群,这种情况彻底变了——训练跑一周,中间遇到一两块卡报ECC错误退出,太正常了。
我自己的经验是:GPU的ECC显存错误、HBM热节流、PCIe链路不稳定这三类问题,占了我们算力故障的七成以上。特别是型号较老、服役时间较长的卡,ECC错误会随着时间推移越来越频繁,如果不在框架层面做容错,一个几百卡规模的训练任务可能每两三天就被一块坏卡拖死一次。
解决这个问题,最基础的一步是把GPU健康检查做成常态化的、自动化的机制。我们当时的做法是:每张卡在加入资源池之前都会跑一轮压力健康检查,同时引入GPU监控面板,对温度、功耗、显存ECC错误计数、PCIe链路速率实时采集。如果某张卡的GPU仅剩X8通道(正常应该是X16),载入任务的时候就能直接发现,而不是等训练跑挂了之后才由框架报错。
2.2 训练任务的可靠性:checkpoint 策略决定你的心态
分布式训练任务的可靠性,本质上就是checkpoint策略的可靠性。模型训练到第82个epoch突然崩了,如果没有合理的checkpoint,你就得从头再来;如果策略合理,最多损失十几分钟。
这个策略的设计有几个关键点:
第一,checkpoint的持久化不能只依赖本地磁盘。训练节点的本地盘在节点故障时是不可用的,所以正确做法是把checkpoint定期同步到共享存储,也就是对象存储或分布式文件系统。节点本地只保留最近的几个checkpoint,历史版本由共享存储统一管理。
第二,保存频率要结合训练成本和存储成本来权衡。设得太频繁,每个checkpoint动辄几十GB,同步会占带宽和存储;设得太稀疏,一旦故障回退的损失就很大。我见过比较合理的做法是在每N个step保存一次,N的取值让"最大回退成本"控制在15到30分钟的训练量内。例如模型一个step需要30秒,那150个step保存一次,最坏情况也就是回退75分钟的训练量。像这样反推着设参数,才能找到最合适的间距。
第三,训练框架的容错能力要打开。主流分布式训练框架都支持节点故障的自动复活和训练恢复,但这套机制依赖配置正确。我们曾经遇到一个很隐蔽的问题:任务指定了自动重启和checkpoint恢复,但节点重启后连不上共享存储,导致恢复失败。排查到最后是共享存储挂载的时限设置问题,超时时间太短,大checkpoint还没挂上就自动断开了。这种问题,只有真的在故障演练中遇到过,才会提前把存储连接的各项超时参数调好。
2.3 推理服务的弹性伸缩与成本权衡
推理服务和训练任务不一样,它是对外提供实时能力的,稳定性要求更高。但推理服务的资源管理有一个尴尬之处:GPU是昂贵的稀缺资源,不能无脑预留,又不能等到流量高峰才去扩容,因为扩容耗时太长。
一个比较成熟的做法是"分层池化":把GPU资源池分成三层——常驻层、弹性层、冷备层。常驻层保证基础水位,承担稳态流量;弹性层通过自动伸缩跟上流量波动,预留资源不用时就释放给训练任务用;冷备层只在极端的突发流量或重大故障时才启用,平时完全是容量冗余,用于兜底。
这层设计的关键在于容量评估和流量预测。我们对推理服务的容量规划,从来不是靠猜,而是基于历史流量数据做趋势建模,同时对大促、活动、外部事件之类的流量脉冲做专项预留。记得有一次某业务线要上线一个大型活动,预测活动期间推理峰值可能是日常的10倍,我们提前两周就开始做容量推演,从资源占比、队列积压、丢弃策略三个维度反复验证,最后活动当天数值没有超水位。那样的事情做过一次,你才能真正理解什么叫"有规划的可靠性"。
推理服务的另一大痛点是推理批量调度。小批次推理的GPU利用率极低,大批次能提升吞吐但会增加请求排队时延。这个取舍没有标准答案,得针对模型结构和业务SLO做压测。我的建议是:不要迷信"默认配置",每次上线新模型之前,专门做一轮batch_size、并发度、GPU显存三者关系的压测,把关键参数记录下来作为该模型的特有部署配置。
3. 模型质量的守护:数据漂移与模型监控
3.1 为什么要盯着数据漂移
数据漂移这个词,刚接触AI系统的人可能觉得离自己很远,但它实际上是线上AI系统最普遍、最隐蔽的失效原因。所谓数据漂移,是指模型上线后,真实业务数据的分布和模型训练时使用的数据分布逐渐产生了偏差,导致模型效果不断下滑。
用一个简单的例子说明:一个反欺诈模型,训练时看到的欺诈样本比例是1%,正常运营状态下这个比例基本稳定。如果业务形态发生变化,或者是黑产改变了攻击模式,线上欺诈样本的特征分布就可能和训练时期完全不同,模型就失去了判别能力。这时候你去看模型的错误率、AUC、精确率,可能并没有明显变化,但真实世界的"业务结果"已经非常差了。
所以监控数据漂移,不能只看业务指标,更要看模型所依赖的关键特征的分布变化。我常用的做法是为每个线上模型维护一个核心特征清单,对每个特征实时计算训练分布和线上分布之间的差异度指标。差异度可以通过PSI(群体稳定性指数)或者更简单的KL散度来做。经验阈值一般是:PSI小于0.1表示正常波动,0.1到0.25表示有漂移信号,大于0.25则说明该特征已经发生了显著变化,必须人工介入。
3.2 模型告警设计:不是所有指标都适合直接设阈值
模型相关的告警设计,和传统SRE的告警设计有很大不同。传统告警的阈值可以按照严密的数学逻辑来定:CPU超过80%就告警,超过了就是有问题。但模型效果类指标天然有波动性,如果你对线上推理准确率设一个硬性阈值,你会发现白天正常、晚上告警不断——因为业务流量的分布是随时间变化的,晚上和白天的人群、行为模式都不同。
更合理的方式是"基线对比+相对偏差"的告警策略。我们不直接看准确率的绝对值,而是将它和"最近7天同一时段的基线值"做比较,超过某个比例才触发告警。这个思路解决了一个很大的问题:不同业务线的模型效果差异巨大,不可能用一套绝对值阈值覆盖所有场景,用基线对比则天然适配每个模型的常态表现。
模型告警的另一个经典坑是"样本量不足导致的假告警"。灰度发布比例只有5%的时候,某一天模型效果指标下跌了20%,你可能很紧张,但算一下样本量,这个下跌的置信区间可能非常宽,根本说明不了问题。解决方式是在告警逻辑里加入最小样本量判断:样本量不够的时候,不触发告警,只做记录。
3.3 灰度发布与快速回滚
模型发布是AI系统变更管理里风险最高的一环。模型不像代码——代码变更可以用单元测试和集成测试覆盖大部分场景,模型的效果评估本质上是统计意义上的,线上表现和离线评估之间可能存在巨大差异。
我们当时的固定流程是:模型发布必须经过三个阶段的灰度——内部员工放量、小流量客户放量、全量放量。每个阶段都有独立的评估周期和回滚条件。内部员工阶段除了看指标,还会让人工抽检模型输出;小流量阶段盯的是业务效果指标和用户反馈;全量阶段最看重的是监控告警是否稳定。
回滚机制上,有一个细节很容易被忽略:模型回滚不是切换版本就够了,还要考虑"特征数据兼容性"。如果新模型依赖了新的特征工程逻辑,而线上特征服务已经按照新逻辑生产数据了,那么回滚到旧模型时,旧模型能不能正常消费新特征?这个问题想不明白,就会出现"模型版本回滚了,但线上效果回不去了"的怪事。
所以我们在做模型发布方案的时候,都会顺便做好特征逻辑的双版本兼容方案。发布期间新旧特征同时生产,回滚后自动切换特征解析逻辑。这套机制虽然增加了一些开发量,但长期来看是值得的。
4. 可观测性建设:AI系统怎么"看出来"问题
4.1 指标选型:基础设施指标之外还要看什么
传统可观测性的三大支柱——日志、指标、链路追踪——在AI系统里依然成立,但指标的内涵需要大幅扩展。除了常规的基础设施指标,我认为至少要额外关注四类AI专属指标:
- 模型服务层:推理时延、吞吐、显存占用、批大小、排队长度;
- 模型质量层:准确率、召回率、AUC、均值分数、拒绝率;
- 特征数据层:特征覆盖率、缺失率、分布差异度、上游数据时延;
- 资源效能层:GPU利用率、显存利用率、算力浪费率。
这四类指标缺一不可。如果只盯着第一类,你就只能知道"服务活着",不知道"服务活得好不好";如果不看第三类和第四类,你就无法回答业务方最常问的"这个模型为什么效果变差了"和"我是不是要再加两张卡"。
一个特别容易被忽视的指标是"请求级模型输入校验率"。这个指标值的是:每个推理请求在进入模型前,是否通过了输入完整性校验,校验后发现异常的比例是多少。这个指标的意义在于:很多推理结果"看起来正常但实际不对"的问题,根源是上游传入的特征数据缺字段、类型错乱、或者超出合理范围。没有这道校验关卡,模型会拿脏数据计算出看似合理的输出,而外部的业务方毫不知情。
4.2 全链路追踪在AI系统里的特殊之处
传统微服务的链路追踪,跟踪的是请求经过各个服务的时间消耗。AI系统多了一段"不可拆分的黑盒时间"——模型推理本身的时间。外部看一个推理请求可能耗时150ms,但你不知道其中50ms花在特征处理上、80ms花在模型计算上、20ms花在后处理上。没有内部切片信息,性能优化和故障定位都无从下手。
我们的做法是在推理服务内部针对每个请求埋点,把耗时拆分成:特征获取、预处理、推理、后处理、返回网络耗时五个阶段。这样一旦某个模型的时延劣化,我们就能立刻判断是哪个环节出了问题。
这个机制在排查一个典型案例时帮了大忙:某模型的P99时延从200ms涨到了500ms,传统的链路追踪只能看到整体变慢了。拆分后才发现,涨的其实是特征获取阶段——原因是某个上游特征服务的连接池配置被误改,导致连接复用率下降。没有内部的阶段埋点,这类问题要靠猜,可能要花好几个小时才能定位。
4.3 告警治理:别让告警变成没人看的背景噪音
告警疲劳是AI系统稳定性工作里特别头痛的问题。因为模型指标天生有波动性,如果告警阈值设置不当,你的手机夜里会被各种"模型AUC较基线下降5%"的消息塞满,等真的出了重大问题,反而没人第一时间响应了。
我总结了一套告警治理的心法,三条最核心:
第一,告警必须分级。P1级是服务不可用、数据严重丢失、模型完全失效;P2级是服务质量下降、效果指标明显恶化;P3级只是提示性的,比如资源水位偏高、某特征分布出现轻微漂移。P3级的告警应默认不直接打扰人,进告警池就好。
第二,相同根因的告警必须做收敛。一个上游数据源挂了,可能同时触发日志告警、特征缺失告警、模型效果告警、业务量告警四条独立的告警。如果不做关联收敛,值班同学会看到一个告警轰炸,但根本不知道这四个其实是同一件事。把根因、影响对象、关联告警列表一起塞进告警内容里,是AI系统告警设计里最值得投入精力的一项工作。
第三,告警内容要附带"处置建议"。每个告警模板里都要写清楚:这个告警可能是什么原因、应该先检查什么、有哪些已知的缓解手段。这么做最大的收益是降低了响应门槛——新同学值班时不会因为看不懂告警而手足无措。
5. 故障排查实录:AI系统典型问题的排查思路
5.1 案例一:模型推理越来越慢,根因在显存碎片化
有一段时间,某个推理服务的P99时延每过两三天就爬升一次,重启后恢复,过几天又照旧。初步判断是性能劣化问题,不是效果问题,于是先看资源指标。
排查发现:CPU正常,网络正常,但GPU显存碎片率随时间持续上升,同时推理内核的执行时间也在变慢。原因很快定位:该推理框架默认的显存分配策略在长时间运行后会产生大量碎片,导致后续的显存分配经常触发缓存清理操作,拖慢推理速度。
解决方式是调整显存分配策略,并给服务加了一个定时任务——每天在流量低峰期执行一次显存整理和模型重载操作。这个问题提醒了我一个规律:AI系统的性能劣化往往不是线性的,而是累积性的,类似"内存碎片化""连接池老化""显存缓存膨胀"这类慢性问题,最好通过自动化巡检来提前发现,而不是等时延告警触发才动手。
5.2 案例二:模型效果突然跳水,排查链路比想象中长
另一个让我印象深刻的案例是:某推荐模型的点击率指标突然下降了15%,时间点很明确,但原因非常难找。我们按传统思路先做了发布排查,确认最近没有模型或代码变更,又看了基础设施指标,一切正常。排除了第一轮常见可能之后,才开始怀疑数据侧。
检查特征覆盖率和数据时延后发现了端倪:线上好几个关键特征的缺失率从1%左右跳到了30%。顺着数据链路往上游查,最终定位到某个数据采集服务的配置变更,导致一批设备的特征上报丢失。这个问题如果没有特征覆盖率这类AI定制指标,纯靠传统监控几乎无法发现——因为下游模型还在正常计算,只是输入残缺了。
这个案例让我明白,AI系统的故障排查,绝不能只停留在"是不是模型变差了"这个层面,而是要有一个清晰的排查漏斗:先排除发布变更、再排除基础设施、再检查特征数据管道、最后检查模型输入输出分布。每一步都要有对应的监控数据支撑,不然排查过程会变成大海捞针。
5.3 故障复盘与稳定性文化建设
AI系统的故障复盘,比传统系统更容易流于形式,因为很多AI故障的因果关系不那么直接。模型效果下降,可能是数据问题,也可能是模型问题,还可能只是正常的业务波动。如果复盘只追求"找到一个责任人",最后得出的结论通常是"增加人工审核",对真正的稳定性提升没有帮助。
我的经验是:AI系统的复盘要特别关注"监控盲区"和"假设错误"。每次故障后,除了常规的时间线、影响范围、恢复动作,还要诚实地回答两个问题:这个故障发生之前,我们有没有可能提前发现它?我们现有的监控体系里,是否存在同类事件的其他盲区?
遇到过一家公司是这么做的:每次AI相关故障复盘后,必须产出一个"监控补盲"动作,要么新增指标、要么调整告警规则、要么补充自动化巡检项。这个机制坚持了半年,AI系统的故障率明显下降。因为很多故障本质上是"没看见"的问题——如果你早就知道它的存在,大都不会拖到严重才处理。让每一次故障都变成监控体系进化的燃料,才是一支稳定性团队最核心的成长方式。
6. 实战避坑速查表与日常巡检推荐
6.1 常见问题定位速查
我做了一张速查表,列一下AI系统日常最常出现的问题类型、可能原因、第一排查动作,方便大家直接对照:
| 症状 | 可能原因 | 第一排查动作 |
|---|---|---|
| 推理时延缓慢爬升 | 显存碎片化、缓存膨胀、连接池老化 | 查看显存碎片率、推理内部阶段耗时拆分 |
| 模型效果指标骤降 | 特征数据缺失、上游数据变更 | 检查特征覆盖率与分布差异度指标 |
| GPU利用率很低 | 批次太小、调度不均、单请求时延瓶颈 | 压测batch_size与并发度曲线 |
| 训练频繁中断 | 硬件故障、checkpoint恢复失败、网络抖动 | 检查节点健康状态与checkpoint日志 |
| 模型输出异常但指标正常 | 请求输入脏数据、特征校验缺失 | 检查请求级输入校验率与特征范围异常 |
这个表不是权威标准,但它覆盖了我们最常遇到的五类问题。每个AI业务的数据特征和模型架构不同,速查内容应该按自己的运维实践持续沉淀,最终形成团队内部的知识库。
6.2 日常巡检清单
稳定性工作不能全靠告警被动触发,主动巡检同样重要。我建议AI系统的SRE团队至少每周做一次自动化巡检,覆盖以下几个关键点:
- GPU硬件健康状态:检查ECC错误计数增量、PCIe链路速率、温度趋势;
- 显存碎片率与推理时延趋势:对比一周内的变化曲线,提前发现性能劣化;
- 模型核心特征的分布差异度:重点看是否出现超过经验阈值的漂移信号;
- 推理服务容量水位:对比实时流量和预留容量,识别潜在瓶颈;
- 训练任务checkpoint有效性:抽查最近一次checkpoint的完整性和恢复演练。
这份巡检清单和告警系统配合使用,告警负责抓"已经发生的问题",巡检负责抓"正在累积的问题",两者合起来才算是完整的稳定性防线。
6.3 最后说一句心里话
做AI系统的SRE,很多时候最难的并不是技术本身,而是心态上的转变。传统运维的成就感来自"系统稳如老狗",但AI系统的稳定性是一个持续的、动态的对抗过程——今天处理完数据漂移,明天可能冒出来一个特征工程的变更引发新的问题。你永远无法用一次大规模改造来一劳永逸地解决所有问题,只能靠一套持续运转的机制,把问题一点点地提前发现、提前排掉。
我个人的建议是:如果你要往这个方向发展,一定要优先建立"数据意识和模型意识"——不只是把GPU集群扛稳,更要理解模型是怎么训练的、线上特征是怎么流转的、业务方真正关心的是什么指标。你越接近业务本身,就越能在故障发生之前做出预判。这套"不仅服务不能挂、结果还得靠谱"的能力,才是超级SRE真正的价值所在,也是这个角色在未来几年里越来越值钱的根本原因。