影子流量、金丝雀与 LLM 渐进部署


文档摘要

影子流量、金丝雀与 LLM 渐进部署 本节摘要:LLM 上线集合了软件部署最难的部分:没有单元测试、失败模式弥散、信号延迟。顺序是(1)影子模式——把生产请求复制给候选模型,记录、对比,零用户影响;能抓明显的分布问题但非质量保证;(2)金丝雀——渐进流量切换 10% → 25% → 50% → 75% → 100%,每步设门;跟踪延迟百分位、成本/请求、错误/拒绝率、输出长度分布、用户反馈率;(3)A/B 测试,用于稳定性确认后的不同备选。非确定性不可消除——同输入跨运行最高 15% 准确率变化,源于 GPU 浮点非结合性加批次大小方差。成本是变量不是常量——一个 20% 更好的模型可能每调用贵 3 倍。回滚速度是决定性的:若回滚要重新部署,你太慢。

影子流量、金丝雀与 LLM 渐进部署

本节摘要:LLM 上线集合了软件部署最难的部分:没有单元测试、失败模式弥散、信号延迟。顺序是(1)影子模式——把生产请求复制给候选模型,记录、对比,零用户影响;能抓明显的分布问题但非质量保证;(2)金丝雀——渐进流量切换 10% → 25% → 50% → 75% → 100%,每步设门;跟踪延迟百分位、成本/请求、错误/拒绝率、输出长度分布、用户反馈率;(3)A/B 测试,用于稳定性确认后的不同备选。非确定性不可消除——同输入跨运行最高 15% 准确率变化,源于 GPU 浮点非结合性加批次大小方差。成本是变量不是常量——一个 20% 更好的模型可能每调用贵 3 倍。回滚速度是决定性的:若回滚要重新部署,你太慢。策略住在配置/flag;模型住在带固定摘要的注册表;回滚 = 翻策略 + 还阈值 + 秒级钉回旧模型。

对应原课程:Phase 17 · Lesson 20 · 20-shadow-canary-progressive(原英文 phases/17-infrastructure-and-production/20-shadow-canary-progressive/docs/en.md)。

学习目标

阅读完本节,你应当能够:

  1. 区分影子模式(零影响对比)、金丝雀(真实流量渐进)、A/B(稳定性确认后的对比)。
  2. 列出五项 LLM 专属金丝雀指标(延迟、成本/请求、错误/拒绝、输出长度分布、用户反馈)。
  3. 解释为什么 LLM 非确定性(最高 15%)改变了上线中「稳定」的含义。
  4. 设计一条秒级(策略翻转)而非小时级(重新部署)的回滚路径。

一、问题与直觉

你上线一个新模型。离线评测显示 3% 准确率提升。你生产里翻开关。24 小时内,成本涨 40%、用户踩涨 8%、三个客户工单报「奇怪答案」。你回滚。重新部署花 3 小时。你的周末毁了。

每一步都可避免。影子模式会在任何用户看到前抓到 40% 成本尖峰。金丝雀会在踩涨时停在 10%。策略 flag 回滚会花 30 秒。纪律,就是填补「离线评测看着好」与「真实用户满意」之间鸿沟的东西。

二、核心概念

影子模式

候选接收与生产相同的请求;输出被记录,不返回用户。零用户影响。记录:

  • 输出内容(对生产做 diff)。
  • token 数(成本差)。
  • 延迟。
  • 拒绝与错误。

能抓:成本爆涨、长度回归、明显拒绝变化、硬错误。不能抓:用户会感知的质量差。影子是冒烟测试,不是质量测试。

金丝雀

渐进流量切换带门。典型进度:1% → 10% → 25% → 50% → 75% → 100%。每步对 5 指标设门:

  1. 延迟百分位 —— P50、P95、P99。违规:金丝雀 P99 > 1.5× 基线。
  2. 每请求成本 —— 混合美元。违规:>基线 20%。
  3. 错误/拒绝率 —— 5xx 加显式拒绝。违规:2× 基线。
  4. 输出长度分布 —— 均值 + P99。违规:分布漂移。
  5. 用户反馈率 —— 踩 / 工单。违规:1.5× 基线。

非确定性是新方差

相同输入产生不同输出。原因:

  • GPU 浮点非结合性(浮点归约顺序随批次变)。
  • 批次大小方差(同提示在 128 批次 vs 16 批次)。
  • 采样(温度 >0)。

实测:同评测集跨运行最高 15% 准确率变化。上线中「稳定」指指标在预期方差内,而非与基线相同。门设在噪声底之上。

成本是变量

一个 20% 更好的模型可能每调用贵 3 倍。成本/请求是五门之一。上线一个「更好」却破坏单位经济的模型,是回滚案例。

回滚是武器

  • 策略 flag(特性 flag 系统):在配置里翻百分比;秒级。
  • 模型钉(注册表摘要):钉住的模型不自动升级。
  • 回滚 = 还 flag + 设钉摘要到前版。秒,非小时。

若你的栈要重新部署才能回滚,先修这个再上线。

工具

Argo Rollouts / Flagger —— Kubernetes 渐进交付控制器,集成 Istio/Linkerd 加权路由。

Istio 加权路由 —— 服务网格级流量切分。

KServe / Seldon Core —— 带内建金丝雀的模型服务。

特性 flag —— LaunchDarkly、Flagsmith、Unleash。策略级翻转,无重新部署。

指标节奏

金丝雀门依流量每 515 分钟检查一次。1% 流量在 10 请求/分下,每窗口 50150 数据点——够看延迟,但用户反馈噪声大。10% 给约 10 倍样本。进度应在每步停够久以累积足够样本。

A/B 步可选

若新模型明显不同(行为不同、成本曲线不同、语气不同),金丝雀通过后在 50% 做 A/B。若只是改进版,金丝雀门通过就直接到 100%。

你该记住的数字

  • 金丝雀进度:1% → 10% → 25% → 50% → 75% → 100%。
  • 非确定性上限:同输入跨运行最高 15% 方差。
  • 五金丝雀指标:延迟、成本、错误/拒绝、输出长度、用户反馈。
  • 成本门:>基线 20% 即违规。
  • 回滚:秒,非小时。

三、从零实现:金丝雀进度模拟器

原课程 code/main.py 模拟带注入回归的金丝雀上线,报告上线停在哪个阶段、哪个门触发。下面给最小可读的门判定骨架。

def canary_gate(metrics, baseline, multipliers): """判定金丝雀在某阶段是否过关。 metrics: {'p99_latency_ms':, 'cost_per_req':, 'error_rate':, 'output_len_mean':, 'thumbs_down_rate':} baseline: 同结构的基线值 multipliers: 各指标的违规乘数,如 {'p99_latency_ms':1.5, 'cost_per_req':1.2, ...} 返回: (是否过关, 触发的违规指标列表) """ breaches = [] checks = [ ("p99_latency_ms", "P99 延迟", multipliers.get("p99_latency_ms", 1.5)), ("cost_per_req", "每请求成本", multipliers.get("cost_per_req", 1.2)), ("error_rate", "错误/拒绝率", multipliers.get("error_rate", 2.0)), ("thumbs_down_rate", "踩率", multipliers.get("thumbs_down_rate", 1.5)), ] for key, label, mult in checks: if metrics[key] > baseline[key] * mult: breaches.append(f"{label}: {metrics[key]} > 基线×{mult}") return len(breaches) == 0, breaches # 案例:候选 P99 480ms(基线 300),成本 0.12(基线 0.10,×1.2 门=0.12 边界) m = {"p99_latency_ms": 480, "cost_per_req": 0.125, "error_rate": 0.01, "thumbs_down_rate": 0.05} b = {"p99_latency_ms": 300, "cost_per_req": 0.10, "error_rate": 0.008, "thumbs_down_rate": 0.04} ok, breaches = canary_gate(m, b, {"p99_latency_ms": 1.5, "cost_per_req": 1.2}) print(f"过关={ok}, 违规={breaches}") # 延迟门(300×1.5=450)被 480 触发 → 停在此阶段

💡 金丝雀的门必须设在非确定性噪声底之上。若你的评测本就有 ±7% 方差,「成本 +5%」不是违规,「成本 +20%」才是——否则你天天误报。

四、框架对比:三阶段与工具横向对照

阶段 流量 用户影响 抓什么 工具
影子模式 100% 复制 成本爆、长度回归、硬错误 自建日志 + diff
金丝雀 1→100% 渐进 部分 五指标门 Argo Rollouts / Flagger / Istio
A/B 测试 50/50 部分 质量差异(稳定性后) GrowthBook / Statsig(第 21 节)
回滚 翻 flag 即时 LaunchDarkly / Flagsmith / 特性 flag

心法:影子抓成本/长度,金丝雀抓延迟/错误/反馈,A/B 抓质量差异。回滚靠策略 flag,不靠重新部署。

五、可复用产物

本节产出 outputs/skill-rollout-runbook.md(原课程目录)。给定候选模型、基线、风险容忍,它设计影子→金丝雀→100% 计划:

  1. 影子配置:复制比例、记录字段、diff 与告警规则。
  2. 金丝雀进度:各阶段百分比与停留时长(依样本量)。
  3. 五门阈值:各指标乘数,设在非确定性噪声底之上。
  4. 回滚剧本:策略 flag 翻转 + 模型摘要钉回,秒级。

六、练习

  1. 跑通模拟器:运行 code/main.py。注入 25% 成本回归。金丝雀停在哪个阶段?

  2. 成本 vs 准确率:你的新模型离线 +3% 准确率,但成本/请求 +18%。该不该上?依政策——写两条路径。

  3. 60 秒回滚:设计一条端到端 60 秒内的回滚。列出所需基础设施。

  4. 非确定性门:你的评测显示 ±7% 方差。设金丝雀门让你不误报。各乘数用多少?

  5. 影子告警:影子模式在金丝雀前抓到 40% 成本尖峰。写出在影子中触发的告警规则。

本节要点回顾

  1. LLM 上线最难:无单元测试、失败弥散、信号延迟,纪律填补离线评测与真实用户间鸿沟。
  2. 影子模式零影响:复制请求给候选,记录 diff/成本/延迟,抓成本爆与长度回归,但不抓质量。
  3. 金丝雀渐进 1→100%:每步对五指标设门:延迟、成本、错误/拒绝、输出长度、用户反馈。
  4. 非确定性不可消除:同输入跨运行最高 15% 方差,门设在噪声底之上。
  5. 成本是变量:20% 更好的模型可能贵 3 倍,破坏单位经济即回滚。
  6. 回滚靠策略 flag:秒级翻转,不靠重新部署,若需重新部署先修。
  7. 模型钉在注册表摘要:钉住的不自动升级,回滚 = 还 flag + 钉回旧摘要。
  8. A/B 可选:不同备选金丝雀后做,改进版金丝雀过门直接 100%。
  9. 工具栈:Argo Rollouts/Flagger(K8s 渐进)、Istio(网格切分)、LaunchDarkly(flag)。

下一节,我们把 A/B 测试单独拆开——看 LLM 特性的 A/B 测试为何有「感觉问题(vibes problem)」,以及 GrowthBook、Statsig 如何用统计严谨对抗它。


发布者: 作者: Rohit Gupta 转发
评论区 (0)
U