部署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的护栏以及明确的回滚计划。跟随这个花花公子,您将获得快速,可靠和合规的地狱,以可控制的成本稳定地带来业务价值。