部署ML模型
1)角色和目標
部署=在遵守RG/AML/Legal和預算的情況下可靠地將地獄交付給產品和操作。
目標:低潛伏性、高可用性、可重復性、安全性和快速可逆性(滾回)。
2)伺服架構
2.1種模式
在線(實時):REST/gRPC,p95 50-150毫秒用於個性化;RG/AML alert的≤2 -5秒。
近實時:1-5分鐘微庫(OLAP店面)。
Batch/offline:黃金夜店面,WORM出口給監管機構。
流程評分:將輕型模型嵌入到服務中(低延遲)。
Serverless:用於罕見任務的冷啟動功能。
2.2個拓撲
單個模型服務→簡單快捷。
Ensemble/Graph(router → precess → model → postprocess)→復雜的管道。
Sidecar Feature Fetcher →從緩存(Redis/Scylla)中提取在線仙女。
3)模型註冊表和版本
Registry:「model_id」,「version」,「stage={Staging,Production,Archived},」文物(重量,預處理器,校準),要求(CPU/GPU/內存),模型卡(數據,度量,風險,公平性)。
不可移動的文物:內容混合;版本的WORM副本。
輸出策略:僅通過註冊表和聲明性清單。
4)集裝箱化和包裝
Dockerfile(草圖):dockerfile
FROM python:3. 11-slim
ENV PYTHONUNBUFFERED=1
WORKDIR /app
COPY requirements. txt.
RUN pip install -r requirements. txt --no-cache-dir
COPY artifacts/./artifacts/
COPY src/./src/
CMD ["python", "src/serve. py"]
服務器(FastAPI+gRPC,想法):
python serve. py from fastapi import FastAPI import joblib, time app = FastAPI()
model = joblib. load("artifacts/model. joblib")
scaler = joblib. load("artifacts/scaler. joblib")
@app. post("/score")
def score(payload: dict):
t0 = time. time()
x = preprocess(payload, scaler)
y = float(model. predict_proba([x])[0,1])
return {"score": y, "latency_ms": int((time. time()-t0)1000), "model_version": "1. 8. 3"}
5)Kubernetes/Helm和自動滑行
部署(片段):yaml apiVersion: apps/v1 kind: Deployment metadata: {name: ml-score, labels: {app: ml-score}}
spec:
replicas: 3 selector: {matchLabels: {app: ml-score}}
template:
metadata: {labels: {app: ml-score}}
spec:
containers:
- name: api image: registry/ml-score:1. 8. 3@sha256:...
ports: [{containerPort: 8080}]
resources:
requests: {cpu: "500m", memory: "512Mi"}
limits: {cpu: "2", memory: "2Gi"}
envFrom: [{secretRef: {name: ml-secrets}}]
readinessProbe: {httpGet: {path: /healthz, port: 8080}, periodSeconds: 5}
livenessProbe: {httpGet: {path: /livez, port: 8080}, periodSeconds: 10}
HPA(通過RPS/CPU):
yaml apiVersion: autoscaling/v2 kind: HorizontalPodAutoscaler metadata: {name: ml-score-hpa}
spec:
scaleTargetRef: {apiVersion: apps/v1, kind: Deployment, name: ml-score}
minReplicas: 3 maxReplicas: 50 metrics:
- type: Pods pods:
metric: {name: requests_per_second}
target: {type: AverageValue, averageValue: "15"}
- type: Resource resource: {name: cpu, target: {type: Utilization, averageUtilization: 70}}
6)推出策略
影子(暗啟動):新模型處理請求的副本,將忽略響應;指標/潛力/價值比較。
金絲雀:1-10%的流量→ 25% → 50% → 100%的綠色SLO;降解時自動回滾。
藍綠色:平行堆棧;即時路由卷軸。
Gradual Feature Flag:跨市場/隱患/設備的路由。
A/B/n:序列測試在線實驗。
yaml routes:
- match: {tenant: "EEA"} # feature-flags/rules to: {model: "1. 8. 3", weight: 20}
- match: {tenant: "EEA"}
to: {model: "1. 7. 9", weight: 80}
7) Fichi online/offline: 對等
統一轉換庫和功能商店(online+offline)。
等效性測試:在線模擬和參考樣本上的離線基準之間的MAE/MAPE。
Cash Fitch:Redis/Scylla,TTL用於窗口功能;taymauts和fallbacks。
8)可觀察性,SLO和異位
8.1 SLI/SLO地標
潛伏性:p95 ≤ 150毫秒(個性化),p99 ≤ 300毫秒;RG/AML Alerta ≤ 5具有端到端。
可用性: ≥ 99。9%.
地獄錯誤: ≤ 0。5% 5xx;coverage ≥ 99%.
漂移:PSI fich/scora<閾值,ECE(校準)穩定。
Бизнес: uplift Net Revenue, fraud saved, time-to-intervene.
8.2個度量(Prometheus)
yaml
- http_request_duration_seconds{quantile="0. 95"}
- http_requests_total{code=~"5.."}
- model_inference_latency_ms_bucket
- feature_fetch_latency_ms_bucket
- model_score_distribution_bucket
- psi_feature_{name}
- expected_cost_live
Alerta(片段):
yaml
- alert: HighP95Latency expr: histogram_quantile(0. 95, sum(rate(model_inference_latency_ms_bucket[5m])) by (le)) > 0. 15 for: 10m
- alert: DriftDetected expr: psi_feature_amount_base > 0. 25 for: 15m
Трейсинг: OpenTelemetry — span’ы `feature_fetch`, `score`, `postprocess`, `guardrail`.
9) RG/AML guardrails和安全政策
Pre-/Post-filter:禁止活動的面具(放映頻率,冷落,禁止侵略性離場)。
Policy Shielding:高於RG閾值→軟幹預/暫停。
審計:編寫「policy_id」,「propensity」,「mask」,「decision」,「reason」。
PII和居住權:代幣而不是ID,EEA/UK/BR上的單獨加密密鑰和集群;禁止無根據的跨區域合作。
秘密:KMS/CMK,秘密經理;博客/預告片中沒有PII。
10)校準、閾值和決策策略
校準(Platt/Isotonic)作為人工制品。
開銷閾值;可在註冊表/幻燈片中配置。
安全帽: 上面/下面的動作邊框,手動覆蓋,以配合.
11)回滾,降解和DR
單擊滾動:將路由切換到以前的「模型_版本」。
Runbook:腳本「latentnost↑」,「5xx↑錯誤」,「漂移/校準破裂」,「無法使用外部財務提供商」。
故障隔離:電路斷路器,retry/backoff,最後一個有效解決方案的緩存。
DR:文物/註冊表備份,復制到「溫暖」區域,演習。
python try:
features = fetch_features(timeout=30)
except TimeoutError:
features = last_known_good(user_id) # fallback
12)成本工程和性能
路徑分析:fichi(30-60%),模型(20-40%),網絡/IO(10-30%)。
降低成本:熱點緩存,中繼配額,輕量級模型,INT8/FP16(如果適用),lazy-postprocess。
RPS/CPU/latency上的HPA,流媒體上的狀態大小限制。
Chargeback: cost/request, cost/feature;市場/團隊預算。
13)安全發布和合規性
準備就緒標準:陰影上的SLO綠色,沒有漂移/泄漏,模特卡滿,幻燈片正常。
調節:WORM發布存檔(重量、校準、閾值、度量、測試日誌)、不可更改的出口報告。
DSAR/RTBF:從腰包/登錄/照片中刪除特定用戶痕跡的過程。
14) QA推出前
集成測試:API合同,幻想方案,「空/極端」案例。
負載:p99,分布尾巴,爆破流量。
在線/離線等效性測試。
混沌測試:關閉遠程緩存/基地,外部服務時間表。
15)配置示例
帶有金絲雀路由的Ingress(想法):yaml
- match: [headers: {x-exp: "canary"}]
route:
- destination: {host: ml-score-v1-8-3, weight: 20}
- destination: {host: ml-score-v1-7-9, weight: 80}
模型健康(端口):
python
@app. get("/healthz")
def health():
return {"ok": True, "model_version": "1. 8. 3", "registry_sig_ok": verify_signature()}
16)流程和RACI
R(響應):MLOps(旋轉/編排/可觀察性),Data Eng(fici/緩存/合同),數據科學(模型卡/校準/閾值)。
A (Accountable): Head of Data / CDO.
C(咨詢):合規性/DPO(PII/RG/AML/DSAR),安全(KMS/秘密/審計),SRE(SLO/事件),財務(ROI/預算)。
I (Informed):產品/營銷/運營/支持。
17)實施路線圖
MVP(3-6周):1.模型註冊表和固定文物;FastAPI/gRPC服務+K8s/Helm。
2.帶有p95/5xx/漂移監視的影子發射,相等測試。
3.金絲雀10% → 50% → 100%帶有自動回滾和警報。
4.模型卡,校準,開銷閾值和Guardrails v1。
第二階段(6至12周):- Ficha-cache, circuit breakers, runbooks/DR練習。
- RPS/latency上的自動滑行,成本降壓板和chargeback。
- 幻燈片監視fairness,WORM發行檔案。
- Serving圖形(候選者→重新排名),板條紋拼寫。
- 多區域,居住地(EEA/UK/BR)具有單獨的密鑰。
- 自動傾斜/漂移,質量報告/校準自動生成。
18)準備就緒支票清單
- 模型卡已滿;數據/fici/校準/閾值已轉換。
- 在線/離線等價合同和測試為綠色。
- SLO: p95, 5xx, coverage-陰影上的綠色和10%的金絲雀≥ 24小時。
- Alerta和dashbords (潛在/錯誤/漂移/expected-cost)包括在內。
- Guardrails RG/AML和決策審核處於活動狀態;PII/居住權。
- 單擊滾動和事件運行手冊進行了測試。
- 成本適用於預算;HPA和緩存已配置。
19)反模式和風險
沒有註冊表和固定人工制品的手工拔出。
未協調的在線/離線照片→銷售差異。
沒有影子/金絲雀→隱藏回歸。
閾值不是通過開銷,沒有校準。
同步外部lookups不帶計時/緩存。
沒有DR/rollback,沒有WORM發行檔案。
20)結果
ML生產不是「模型調用」,而是工程平臺:註冊表和版本,安全外賣(shadow/canary/blue-green),健身和校準學科,可觀察性和SLO,RG/AML的護欄以及明確的回滾計劃。跟隨這個花花公子,您將獲得快速,可靠和合規的地獄,以可控制的成本穩定地帶來業務價值。