SICI · 蕴灵宗 · 第二十章 · 元婴五层

部署归元

AI部署与MLOps · 元婴五层

你以为把模型包成接口就算上线了。可在部署之门前,真正的战场在上线之后——实验室里精度 99% 的模型,上线三周就掉到 85%。漂移之雾在雾里立赌:你以为部署是终点,我赌你的模型活不过一个季度。

漂移之雾低语:「你觉得模型上线后最大的挑战是什么?随便猜。你说它为什么上线就变笨?」
序章

部署之门

漂移之赌 · 核心挑战四选 · MLOps 全景

部署之门的门楣上刻着八个字:模型归山,部署归元。门内是一面巨屏——屏的左侧浮着实验室的离线指标:精度 99%、AUC 0.98;屏的右侧浮着生产环境的实时曲线,红线一路下滑。高斯老祖站在屏前,手里只有一块黑板,上面写着:上线不是终点。

部署之门:离线指标与生产实时曲线的分野
高斯老祖 高斯老祖

「实验室里你的模型是温室的花,生产环境是旷野的风。告诉我,AI 模型上线后最大的挑战是什么?先猜,猜错了也没关系,漂移之雾会记账。」

漂移之雾 漂移之雾

「又来了一个想上线的。打个赌——你觉得模型上线后最难的是什么?你每猜错一次,雾就浓一分,我都记下来。」

漂移之赌 · 上线核心挑战预测挑战器

反直觉下注(四选一,可连错)→ 挑战展开 → MLOps 全景图拼合

漂移之雾逼你下注:AI 模型上线后最大的挑战是什么?逐个点击。
详解 · K20-16 MLOps 成熟度模型:从手动到全自动

Google MLOps 三级:L0 手动流程——notebook 训练、手动部署、漂移靠人肉发现,模型与代码脱节;L1 ML pipeline 自动化——训练流水线自动跑,但部署与重训仍需人触发;L2 CI/CD 全自动闭环——代码/数据/模型变更自动过测试、自动构建、自动部署,叠加持续训练(CT):监控检测漂移→自动触发重训→自动上线→指标劣化自动回滚。本章走过的正是 L0→L2 全程:S1 服务化、S2 容器化是部署地基,S4 监控是传感器,S5 CI/CD 与 S6 灰度是传动轴,S8 弹性是供血系统。判级标准只有一条:出漂移后,人要动几步。

第一幕 · 自信→崩塌 前奏

模型服务化 · 从脚本到服务

REST / gRPC / 流式推理 · 同步 vs 异步 vs 批处理

门后是一座服务台。台上摆着三种接口牌:REST、gRPC、流式。高斯老祖递给你一个训练好的模型权重文件:「在实验室它是个 .pt 脚本,在生产环境它得变成一个服务——能被调用、能并发、能容错。你选一种接口,看数据怎么流。」

高斯老祖 高斯老祖

「REST 用 HTTP/JSON,通用但慢;gRPC 用 Protobuf/HTTP2,快但需要桩代码;流式推理用 WebSocket/gRPC-stream,适合长序列。同步推理实时但吞吐低,异步推理吞吐高但延迟大,批处理最省 GPU 但不能实时。」

漂移之雾 漂移之雾

「你肯定觉得包成 REST 接口就行了。所有人都是这么想的——然后一个请求 800ms,QPS 上不去,用户全跑了。」

服务架构器 · 接口选型 + 延迟特性对比

切换 REST / gRPC / 流式看数据流 → 对比同步 / 异步 / 批处理延迟

服务架构 · 请求 → 推理 → 响应

延迟特性 · 同步 / 异步 / 批处理

详解 · K20-01 模型服务化架构:请求-响应/流式/批处理

三种服务形态对应三种延迟预算:请求-响应(同步)——客户端等单个结果,延迟=排队+前处理+推理+序列化,p99 由慢尾决定;流式——LLM 逐 token 回吐,首 token 延迟(TTFT)与每 token 间隔才是体验指标,总延迟被「感知」摊薄;批处理——攒 batch 换吞吐,等待窗口是延迟下限。选型可公式化:QPS×单请求算力 ≤ GPU 数×利用率,超了要么加卡要么改批。S1 实验台三条延迟柱(p50=80/120/300ms)就是三种形态的影子。

详解 · K20-02 REST API vs gRPC:AI 服务的通信协议选择

REST:HTTP/1.1 + JSON,人可读、生态全、网关友好,但 JSON 序列化大 payload 慢 2-5 倍、文本头开销大、无双向流;gRPC:HTTP/2 多路复用 + Protobuf 二进制,同 payload 体积省 3-10 倍、序列化快一个量级、原生支持双向流,代价是要维护 .proto 与桩代码、浏览器端需 grpc-web 代理。经验法则:对外网关用 REST(兼容性),内部微服务间推理调用用 gRPC(吞吐),大模型逐 token 输出用 gRPC-stream 或 WebSocket。

详解 · K20-03 模型服务框架:Triton/vLLM/Ollama

Triton Inference Server:NVIDIA 出品,多框架(TensorRT/PyTorch/ONNX)多模型并存,动态 batching + 多实例并发,适合传统 CV/NLP 模型的生产服务化;vLLM:LLM 专用,PagedAttention 把 KV cache 分页管理,显存利用率翻倍、吞吐比朴素实现高数倍,continuous batching 让请求随到随拼;Ollama:本地/边缘场景,量化模型一键跑,开发者友好但并发能力有限。选型看负载形态:CV 小模型集群→Triton,LLM 高并发→vLLM,个人/端侧→Ollama。

第一幕 · 自信→崩塌 前奏

容器化 · 环境一致性

Docker 镜像构建 · 容器编排 · GPU 调度

服务台后是一座熔炉——Docker 镜像构建炉。炉口吐出层层叠叠的镜像层:基础 OS、CUDA 运行时、Python 依赖、模型权重。高斯老祖:「在你的电脑上能跑,在生产环境跑不了——这句话的解药就是容器。你一步步看镜像怎么叠出来。」

高斯老祖 高斯老祖

「Docker 镜像是分层的——每条指令一层,层有缓存。基础镜像装 CUDA,上面叠 PyTorch,再叠你的代码和权重。容器编排(K8s)管这些容器的生死扩缩,GPU 调度把显卡分给谁。环境一致了,'在我机器上能跑'就成了历史。」

容器化部署模拟器 · 镜像分层 + 编排调度

逐步点亮 Dockerfile 层 → 看容器编排 → 看 GPU 调度分配

Dockerfile 镜像分层构建

容器编排 · Kubernetes Pod 调度

GPU 调度 · 显卡分配

详解 · K20-04 容器化部署:Docker/NVIDIA Container Toolkit

镜像分层:FROM cuda-base → pip install torch → COPY 权重 → CMD 起服务,每层可缓存,改代码只重建顶部两层。GPU 的坑在运行时:容器内看见显卡需要 NVIDIA Container Toolkit(nvidia-container-runtime 把宿主驱动注入容器 namespace),镜像里只装 CUDA 运行库不装驱动——驱动在宿主、库在镜像,版本要对齐兼容矩阵。镜像瘦身三板斧:multi-stage build(编译层与运行层分离)、slim 基础镜像、权重外挂 volume 不进镜像。

详解 · K20-05 编排与调度:Kubernetes + GPU 调度

K8s 三件套:Deployment 管副本数与滚动更新,Service 管负载均衡,HPA 管自动扩缩。GPU 的特殊性:默认 K8s 只调度 CPU,装 NVIDIA GPU Operator/device plugin 后 GPU 才变成可调度资源(nvidia.com/gpu),Pod 在 resources.limits 里声明即可整卡独占——注意 GPU 默认不可超分,一张卡同一时刻只归一个 Pod(MIG 切分或 vGPU 才能破局)。调度层级:集群→节点→卡,碎片化是大集群利用率的隐形杀手。

第一幕 · 第一崩塌

第一崩塌 · 漂移之雾

上线初期良好 → 性能下滑 · 数据漂移 vs 概念漂移

熔炉熄灭,雾从地缝里渗出。你的模型上线第一天,精度 99%,仪表盘一片绿。第七天,96%。第三十天,89%。到第九十天,逼近 85% 的渐近线。你查代码、查权重、查 GPU——全没问题。雾里传来一个不带温度的声音:

漂移之雾 漂移之雾

「你的模型没变,你的代码没变,你的 GPU 没变。变的是世界。用户开始上传夜间照片,可你的训练集全是白天的。模型还活在昨天,世界已经走到今天。第一笔账,我记下了。」

高斯老祖 高斯老祖

「这是漂移。数据漂移:输入分布 P(X) 变了,训练时没见过夜间图。概念漂移:输入到输出的关系 P(Y|X) 变了,比如'猫'的流行定义变了。两者都会让模型退化,但治法不同。你以为上线就完事了——上线只是漂移的开始。」

漂移之雾 · 性能下滑复现 + 漂移诊断

拖上线天数看精度下滑 → 展开数据漂移 vs 概念漂移 → 雾气扩散可视化

上线精度下滑 · 拖动天数

第 1 天
详解 · K20-09 模型监控:数据漂移/概念漂移/异常检测

三双眼睛盯三处:输入侧盯 P(X)——PSI/KS 检验对比训练与线上分布(PSI<0.1 稳定、0.1-0.25 轻微、>0.25 显著);关系侧盯 P(Y|X)——概念漂移没有输入信号可看,只能靠延迟标签回流后的精度/校准度追踪,这是它最难抓的原因;输出侧盯异常——置信度分布突变、单类别占比暴冲,往往是上游故障或攻击的先兆。检测到漂移≠能定位:Sculley 2015 的警告——ML 系统里漂移会级联,一个数据的裂缝会在依赖链上放大成雪崩。

详解 · K20-15 安全与合规:数据保护/内容审核/日志审计

生产环境的模型既是数据入口也是出口:入口——用户上传(夜间照片、文本)可能带 PII 与违规内容,需脱敏与内容审核前置;出口——模型回复可能泄露训练数据(记忆提取攻击),需输出过滤。日志审计是事后追责的底线:谁在什么时候调了哪个版本、输入输出摘要、告警与回滚记录,全链留痕。合规三问:数据从哪来(授权)、存在哪(加密与保留期)、谁看过(访问控制)。监控屏幕上的每条曲线,本身也是要合规的数据。

第二幕 · 挣扎→再崩塌 前奏

模型监控 · 漂移检测

输入分布 · 预测分布 · 性能指标 · 漂移告警

雾散一半,露出一排仪表盘。高斯老祖指着三块屏:「漂移看不见摸不着,但能测。第一块屏看输入分布——PSI/KS 检验;第二块屏看预测分布——置信度偏移;第三块屏看性能指标——延迟、吞吐、业务指标。你拖动时间,看告警什么时候响。」

高斯老祖 高斯老祖

「PSI(群体稳定性指数)量化输入分布的变化:PSI<0.1 稳定,0.1-0.25 轻微漂移,>0.25 显著漂移。预测分布监控看置信度是否异常偏移。性能监控不能只看模型指标,还要看业务指标——点击率、转化率。三者交叉,才能定位漂移。」

监控仪表盘 · 三屏漂移检测 + 告警

拖时间轴看三屏变化 → PSI 越阈值触发告警 → 运维天平记录

第 0 天

输入分布 · PSI

预测分布 · 置信度

性能指标 · 业务

高斯老祖 高斯老祖

「监控是上线后的眼睛;实验追踪是训练期的账本。每次训练跑的超参、数据版本、代码 commit、指标曲线,都得记——MLflow、Weights & Biases 就是干这个。为什么要记?为了可复现性:同一份代码 + 同一份数据 + 同一个随机种子,应能复刻出同一组权重。复现不了,bug 查不动、结果不可信、协作就乱套。固定随机种子、版本化数据与代码、记录环境——三件事做到,实验才算留过案底。

详解 · K20-07 实验追踪与可复现性

监控基线不是天上掉的:训练时的指标分布、超参、数据版本、随机种子,全部来自实验追踪系统(MLflow/W&B 的 run 记录)。可复现性四要素锁死:代码 commit、数据快照(DVC 指针)、环境(镜像 digest)、随机种子——四者齐备,才能在半年后重放出「当时的模型为什么 99%」。没有追踪的模型是黑箱账本:漂移来了,你连基线长什么样都答不出,S4 的三屏联防从第一步就失明。

第二幕 · 挣扎→再崩塌 前奏

CI/CD · 自动化流水线

提交→测试→构建→部署→灰度 · 版本管理 · 回滚

仪表盘后是一条流水线——代码从一端流入,模型从另一端流出。流水线分五段:提交、测试、构建、部署、灰度。高斯老祖:「手动部署一次三天,CI/CD 自动化一次三分钟。但自动化的真正价值不是快——是每次部署都可追溯、可回滚、可验证。」

高斯老祖 高斯老祖

「CI 持续集成:每次提交自动跑单元测试 + 集成测试 + 模型回归测试。CD 持续部署:测试通过自动构建镜像、部署到灰度环境。灰度发布先放 5% 流量,观察指标,没问题再全量。出问题一键回滚到上个版本——版本管理是回滚的底气。」

CI/CD 流水线可视化器 · 五段流水 + 版本回滚

点亮五段流水线 → 看灰度流量递增 → 触发回滚演示

CI/CD 流水线 · 提交→测试→构建→部署→灰度

灰度发布 · 流量递增

详解 · K20-08 CI/CD for ML:模型自动化测试与发布

与软件 CI/CD 的核心差异:要测的不止代码,还有数据与模型。ML 流水线五段:提交(代码+配置)→ 单元/集成测试(含模型行为测试:对抗样本、边界输入、公平性)→ 构建(镜像 + 模型 registry 版本化)→ 部署(staging 环境验证金丝雀指标)→ 发布(灰度递增)。模型测试的独有层:数据校验(schema 漂移检查)、模型回归测试(新版本 vs 线上版本在同一 holdout 上对比,劣化即阻断)。流水线的价值不在快,在「每次变更都走同一扇门」。

详解 · K20-06 模型版本管理:MLflow/DVC/Weights & Biases

三个层次别混:模型 registry 管「哪个版本可部署」(stage: none→staging→production→archived,一跳一审);DVC 管「数据与权重的版本」(大文件用指针存 git,数据集也能回滚);W&B 管「实验的版本」(超参-指标-产物三向绑定)。回滚的物理前提:线上跑的每个版本,其镜像、权重、配置、数据快照四件套都能一键取回——S6 的灰度递增与 S4 的告警回滚,底下垫的都是这套账本。

第二幕 · 挣扎→再崩塌 前奏

A/B 测试 · 渐进上线

流量分配 · 效果对比 · 统计显著性

流水线尽头是一个实验台——台上两根试管,A 是旧模型,B 是新模型。高斯老祖:「灰度只看新模型崩没崩,A/B 测试看新模型好不好。把流量分给 A 和 B,比业务指标,还要做统计显著性检验——否则就是拿噪声当信号。」

高斯老祖 高斯老祖

「A/B 测试把用户随机分两组:对照组用旧模型 A,实验组用新模型 B。比较业务指标(点击率/转化率)。但样本不够大时,差异可能只是随机波动——所以要做假设检验:p 值 < 0.05 才算显著。样本量、效应量、显著性水平,三者共同决定实验可信度。」

A/B 测试实验台 · 流量分配 + 显著性检验

拖流量分配看 A/B 效果 → 拖样本量看 p 值 → 显著性判定

流量分配 · A(旧) vs B(新)

A:50% B:50%

统计显著性 · p 值 vs 样本量

样本量 1000
详解 · K20-10 A/B 测试与灰度发布:AI 服务的渐进上线

灰度与 A/B 是两件事:灰度是工程动作(流量 1%→5%→25%→100% 递增,盯告警随时回滚),A/B 是统计动作(两个版本同时分流,比指标谁显著优)。A/B 的数学纪律:先算最小可检效应(MDE)再定样本量——p=0.05、power=0.8 下检测 3% 的相对 CTR 提升,日活百万级也需数天;分流必须按用户哈希而非请求(同一用户固定分组,否则体验撕裂且样本不独立);反复窥视 p 值会大量假阳性——要么用序贯检验,要么固定检查点。S6 实验台里样本涨、p 值跳,跳的就是这条纪律。

第二幕 · 第二崩塌

第二崩塌 · 成本失控

GPU 利用率低下 · 推理成本飙升 · 弹性伸缩缺失

实验台碎裂,账单从裂缝里涌出。你的推理集群有 20 块 A100,可 GPU 利用率只有 12%——白天流量高峰用不满,凌晨流量低谷全闲置。月账单从 3 万涨到 30 万。雾又浓了:

漂移之雾 漂移之雾

「你为了扛峰值配了 20 块卡,可峰值一天就两小时。剩下 22 小时,卡在空转,钱在烧。你以为堆 GPU 就能解决问题——堆的是成本,不是效率。第二笔账,我记下了。」

高斯老祖 高斯老祖

「成本失控的根源是静态配置——按峰值固定配卡。解药是弹性伸缩:流量大时扩容,流量小时缩容。再叠加批处理、量化、蒸馏把单卡吞吐拉高。成本优化的本质不是砍卡,是让每块卡都在干活。」

成本失控诊断器 · 利用率 + 账单 + 根因

拖时间看利用率低谷 → 展开账单飙升 → 弹性伸缩缺口

GPU 利用率 · 24 小时负载

00:00
详解 · K20-12 成本优化:GPU 利用率/请求调度/模型合并

成本公式拆开打:总成本=卡数×时长×单价,优化只有三条杠杆。利用率:静态配置按峰值买卡,低谷 22 小时空转——批处理把请求攒批、continuous batching 随到随拼,单卡吞吐翻倍等于账单砍半;单价:spot/抢占式实例跑可重试的离线推理,价格约为按需的 1/3;模型体积:量化(FP16→INT8→INT4)与蒸馏,小模型接 80% 简单流量、大模型只啃硬骨头——级联路由。三条杠杆叠乘,S7 的 30 万月账单可以压回 5 万量级。

详解 · K20-13 边缘部署:模型压缩→量化→端侧推理

部署位置的连续谱:云端(全精度、可扩缩)→ 边缘服务器(INT8 量化)→ 端侧(INT4/稀疏化)。压缩三板斧:量化——FP16 权重压到 INT8,体积与带宽减半,精度损失通常 <1%,INT4 需 GPTQ/AWQ 类校准量化;剪枝——删低贡献权重,结构化剪枝(整通道删)才有真实加速;蒸馏——大模型当老师教小模型,损失 5% 精度换 10 倍体积缩减。端侧推理框架(ONNX Runtime/llama.cpp/CoreML)吃的是算子图优化与内存布局,同一模型换个后端吞吐差 3 倍不稀奇。延迟与隐私是端侧的两大红利:数据不出设备。

第三幕 · 顿悟→突破 前奏

弹性伸缩 · 按需分配

负载扩缩容 · GPU 利用率 · 请求队列 · 延迟

账单裂缝后是一座天平——天平左盘是"稳定"(多备卡扛峰值),右盘是"效率"(少备卡省成本)。高斯老祖:「弹性伸缩就是让天平动态平衡。你拖动负载,看集群怎么自动扩缩。」

高斯老祖 高斯老祖

「弹性伸缩靠三个信号:请求队列长度、GPU 利用率、尾延迟。队列堆积就扩容,利用率低就缩容。但扩容有冷启动延迟(拉镜像+加载权重),缩容要优雅停机不丢请求。HPA(水平 Pod 自动扩缩)按 CPU/GPU 阈值触发。天平的目标不是极致效率,是稳定与效率的动态平衡。」

弹性伸缩模拟器 · 负载 + 扩缩 + 天平

拖负载曲线看自动扩缩 → 看 GPU 利用率/队列/延迟联动 → 运维天平

请求负载 · 拖动模拟流量

负载 30%
GPU 利用率--
请求队列--
P99 延迟--
实例数--
详解 · K20-11 弹性伸缩:自动扩缩容策略

三个信号驱动扩缩:队列长度(最直接——积压就是欠的债)、GPU 利用率(有惯性,慢信号)、尾延迟 P99(用户体感的哨兵)。冷启动是弹性之痛:拉镜像+加载权重动辄数十秒到分钟级,流量洪峰来了才扩就晚了——预热池(低配待命 Pod)与镜像预热是标配。缩容比扩容更要温柔:优雅停机(排干队列再退出)+ 缓冲窗口(连续 N 个周期低负载才缩,防震荡)。K8s HPA 默认按 CPU 阈值扩缩,GPU 场景要接自定义指标适配器把队列长度引进来。S8 实验台三条曲线联动,就是这三个信号的同屏。

详解 · K20-14 LLM 应用架构:RAG pipeline/Agent 编排

LLM 服务不是单体:RAG 链路=检索(向量库 ANN 查询)→重排(小模型打分)→生成(LLM 流式),三个组件三种资源画像——检索吃内存与索引、重排吃 CPU/小 GPU、生成吃大 GPU 显存,弹性伸缩必须按组件分层配置而非一刀切。Agent 编排再加循环:规划→工具调用→观察→再规划,单次会话可能拉起几十次 LLM 调用,队列与令牌桶限流是防止自我放大雪崩的闸门。监控也要分层:除接口延迟外,还要盯检索命中率、工具成功率、生成 token 吞吐——任何一环劣化,整条链的 SLO 崩塌。

第三幕 · 最高潮

Boss 战 · 部署三问

漂移之雾 · 漂账清算 · 排除刻痕收网

天平归位,雾重新合拢,温度骤降——漂移之雾凝聚成形。它不是人形,是一团不断变形的紫雾,雾里映着无数下滑的精度曲线。它翻开一本账册:「你来了。带着你的两道刻痕,和你的漂账。三问。答对,我散。答错,你的部署修为归零。」

漂移之雾 漂移之雾

「你说上线就是终点——它不是。我住在你'以为上线就完事'的地方。你每以为部署做完了,我就浓了一分。证明给我看:你的两道刻痕不是耻辱,是你的排除法——每一条'此路不通',都在告诉你正确的路在哪里。」

漂账累计 0 笔 · 三问全对后清零

第三幕 · 收束 · 元婴五层

顿悟 · 部署归元

知识图谱点亮 · MLOps 方法论 · 境界突破 元婴→化神

紫雾弥散,你站在山顶。山脚是你走过的路——服务化、容器化、漂移崩塌、监控、CI/CD、A/B 测试、成本崩塌、弹性伸缩。山顶放着一面归元镜,镜中映着 MLOps 的知识图谱。高斯老祖:「你想把模型搬到生产。面前有三道认知:部署不是终点是起点、成本不是堆卡是效率、MLOps 不是上线是闭环。」

高斯老祖 高斯老祖

「MLOps 的全部,是让模型在生产环境里持续活着。服务化让模型可调用,容器化让环境一致,监控让漂移可见,CI/CD 让迭代安全,A/B 测试让决策可信,弹性伸缩让成本可控。没有一次部署,只有持续闭环。元婴五层,部署归元——你已圆满。但化神之路的第一块基石,不在部署,在……」

部署归元 · 三道认知 + 知识图谱 + 境界突破

点亮三道认知 → 点亮 MLOps 知识图谱 → 境界突破动画(元婴→化神)

三道认知 · 各三选一

服务化(REST/gRPC/流式) → 容器化(Docker/K8s) → 监控(PSI/置信度/业务) → CI/CD(提交→测试→构建→部署→灰度) → A/B测试(流量分配/显著性) → 弹性伸缩(HPA/队列/延迟) → 闭环(持续训练/自动回滚)。每个环节都标着 trade-off。部署不是终点是起点,成本不是堆卡是效率,MLOps 不是上线是闭环。部署归元,漂移永恒。
详解 · 复盘 · 从部署之门到闭环归元的主线(K20-01~16 收束)

本章一条链:模型服务化(REST/gRPC/流式,K20-01/02/03)让权重可调用 → 容器化(Docker/K8s/GPU 调度,K20-04/05)让环境可复制 → 漂移崩塌揭示「上线即开始」(K20-09)→ 监控三屏联防以实验基线为锚(K20-07)→ CI/CD 与版本管理(K20-08/06)让变更可回滚 → 灰度与 A/B(K20-10)让上线可证明 → 成本崩塌逼出优化与边缘部署(K20-12/13)→ 弹性伸缩与 LLM 应用架构(K20-11/14)让系统可持续 → 安全合规(K20-15)是全程底线 → MLOps 成熟度(K20-16)把这一切排成 L0→L2 的阶梯。部署归元:没有终点,只有闭环。

ch21 心魔克制 →
交互实验

推理批处理:吞吐 vs 延迟

拖动批大小,观察推理吞吐与延迟的权衡。