周志洋

个人站

持续学习 才能不被淘汰


模型版本管理与灰度发布

换模型不只是换文件

只换 AWQ 权重时,采样参数和系统提示可能同时被改过。出了质量问题,分不清该回滚哪一层。

拆开三样东西:

  1. 产物:权重、tokenizer、量化结果
  2. 运行配置:并行度、最大长度、dtype 之类
  3. 服务策略:温度、路由比例、限流、Prompt 模板

回滚时可以说「只把流量切回旧策略」,而不必每次重载几十 GB。

命名随便不得

latest 基本等于埋雷。写成类似:

  • qwen2.5-72b-instruct-awq-20251112
  • serve-config-v12
  • chat-policy-v5

元数据里记评测分数、兼容引擎、负责人。两周后的自己会谢现在的自己。

灰度怎么推

资源够、回滚要秒级,蓝绿干脆。GPU 紧就按比例放量:先 1%,再 10%、50%,最后 100%。每一步看错误率、p95 TTFT,再抽几条业务问答题。

引擎大改(比如 vLLM 换 SGLang)更适合影子流量:请求复制到新版本,结果不回用户,先比延迟和输出差异。

路由尽量对 request_id 稳定哈希。同一用户上一句打 A、下一句打 B,对话会飘,日志也对不齐。

from dataclasses import dataclass

@dataclass
class SplitRule:
    stable: str
    new_version: str
    percent: int

def choose(rule: SplitRule, request_id: str) -> str:
    bucket = abs(hash(request_id)) % 100
    return rule.new_version if bucket < rule.percent else rule.stable

上线前后的检查

上线前:离线集过线、目标并发不下 OOM、看板能按 version 过滤、回滚命令演练过。 上线中:新版本先维持一小段流量,别十分钟就飙到全量。 上线后:旧产物留几天;写变更单(谁、何时、改了什么);如果 Dify 在用,确认它用的是别名而不是裸模型名。

回滚也分层:先改百分比(最快),再回配置,最后才重载旧权重。多数质量回退,切路由就够了。

Embedding 变更要重建索引,和 Chat 模型发版错开。两件事同一天做,出问题会特别难拆。


转载请注明:周志洋的博客 » 模型版本管理与灰度发布

打赏一个呗

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦