模型服務的健康檢查:光看行程還活著不夠
模型服務可以「行程還在但已經不能用」。健康檢查必須做真實推論。
傳統健康檢查看 TCP 通不通、HTTP 有沒有 200。模型服務有幾種故障是這樣看不出來的:顯示記憶體碎片化導致每個請求都失敗、模型權重載入不完整、KV 快取耗盡後所有請求排隊。
三層檢查
- 存活(liveness):行程還在、能回應 HTTP。失敗就重啟。
- 就緒(readiness):模型已載入完成。載入中不應該接流量。
- 功能(deep check):實際跑一次極短推論,確認能產生輸出。
# 功能檢查:固定輸入、固定輸出、限時 2 秒
@app.get('/healthz/deep')
def deep():
t0 = time.time()
try:
out = llm.generate('回答 OK 兩個字', max_tokens=5, timeout=2)
except Exception as e:
return {'ok': False, 'error': str(e)}, 503
return {'ok': 'OK' in out, 'latency_ms': int((time.time()-t0)*1000)}別讓檢查本身變成負擔
- 功能檢查頻率要低(例如 30 秒一次),並且用最短的輸入輸出。
- 結果做短期快取,避免多個探針同時打。
- 檢查請求要能被排除在計費與統計之外。
啟動時間要納入設計
大模型載入可能要好幾分鐘。就緒探針的初始延遲要設得夠長,否則編排系統會在載入完成前就判定失敗並不斷重啟,形成永遠起不來的迴圈。
把「模型版本、量化方式、最大長度」放進健康檢查的回應。排查線上問題時,能立刻確認跑的是哪一份權重。