AI服务线上推理异常故障

38 阅读2分钟

AI服务线上推理异常故障排查与恢复实战

一、故障背景与现象

某AI推理服务在线上运行期间突发大面积请求超时,核心指标异常:P99时延由120ms飙升至8s,推理错误率一度达到12%,触发告警风暴。用户侧表现为对话模型响应缓慢、偶发空响应,直接影响业务可用性。

故障定级:P1级线上事故,影响面覆盖全部推理流量。

二、定位思路

遵循"先止损、再定位、后根治"的原则,按以下链路逐层排查:

请求入口 → 网关限流 → 排队等待 → 模型推理 → 资源瓶颈

三、根因分析

通过监控大盘与日志交叉比对,最终锁定三类诱因叠加:

  1. 显存(GPU VRAM)耗尽:推理实例并发请求突增,显存分配失败导致推理进程反复OOM重启;
  2. CPU/内存资源争抢:同机混部调度下,离线任务挤占在线推理资源;
  3. 模型加载缓存未预热:新扩实例冷启动,权重加载耗时导致首请求超时。

四、代码演示

1. 显存监控与预检

import torch

def check_gpu_memory(min_free_gb=8.0):
    if not torch.cuda.is_available():
        return False
    free_mem = torch.cuda.mem_get_info()[0] / 1024**3
    if free_mem < min_free_gb:
        raise RuntimeError(f"显存不足,当前可用仅 {free_mem:.1f}GB")
    return True

2. 推理服务熔断与降级

from functools import wraps
import time

class CircuitBreaker:
    def __init__(self, failure_threshold=5, timeout=30):
        self.failures = 0
        self.threshold = failure_threshold
        self.open_until = 0
        self.timeout = timeout

    def __call__(self, func):
        @wraps(func)
        def wrapper(*args, **kwargs):
            if time.time() < self.open_until:
                raise Exception("熔断中,直接降级返回")
            try:
                result = func(*args, **kwargs)
                self.failures = 0
                return result
            except Exception:
                self.failures += 1
                if self.failures >= self.threshold:
                    self.open_until = time.time() + self.timeout
                raise
        return wrapper

@CircuitBreaker()
def infer(prompt):
    # 实际推理逻辑
    return model.generate(prompt)

3. 冷启动预热

def warmup(model, sample_inputs):
    for text in sample_inputs:
        model.generate(text, max_length=8)
    print("模型权重加载与预热完成")

warmup(model, ["ping", "hello", "测试"])

五、恢复措施

  1. 紧急扩容:横向扩3个推理实例,缓解并发压力;
  2. 独立资源池:将离线任务迁出,保障在线推理CPU/显存配额;
  3. 开启预热:实例上线前自动执行模型预热,规避冷启动超时;
  4. 配置熔断:接入上面的熔断降级逻辑,隔离故障实例。

六、复盘沉淀

  • 完善容量水位告警,提前30分钟预警资源耗尽;
  • 建立资源隔离规范,在线与离线任务严格分离;
  • 故障演练常态化,缩短定位链路。

海量精选技术文档和实战案例持续更新,敬请关注【风骏时光少年】