MLflow 模型别名怎样把新版本切换到 champion 并支持回滚
如果推理代码里直接写死 models:/sales-model/2,每次发布新模型都要改配置、发版并承担回滚成本。更稳妥的做法是给当前线上版本绑定一个固定的别名,例如 champion,服务端始终读取 models:/sales-model@champion。切换时把别名指向新版本,回滚时再把同一个别名指回旧版本,推理代码本身不需要改变。
官方地址:https://mlflow.org/docs/latest/ml/model-registry/workflow/
下面的示例假设注册模型名为 sales-model,当前版本为 2,待上线版本为 3。示例只展示 API 关系和操作写法,版本号应替换为你在 Model Registry 中实际存在的版本。
为什么 alias 能替代固定版本号
模型版本号适合记录不可变的模型产物,champion 则适合表示团队当前选择的部署指针。MLflow 文档把 model version alias 定义为可由用户命名、并且可以在注册后重新指向其他版本的标识;因此调用方可以固定使用 alias,而不必把具体版本号写进服务代码。
| 写法 | 含义 | 切换成本 |
|---|---|---|
models:/sales-model/2 | 明确读取版本 2 | 切换需要修改调用配置 |
models:/sales-model@champion | 读取 champion 当前指向的版本 | 只修改注册中心里的 alias |

切换前先记录当前版本
回滚能否快速完成,关键不在于重新训练模型,而在于切换前是否保存了当前 alias 指向的版本。可以先读取 champion 的模型版本,再把候选版本和发布批次写入你的变更记录。不要只记录“切到版本 3”,还要记录切换前的版本 2、注册模型名、registry URI 和操作时间。
from mlflow import MlflowClient
client = MlflowClient()
model_name = "sales-model"
alias_name = "champion"
# 先读取当前 alias,保留回滚目标;没有 alias 时会抛出异常,需要单独初始化。
current = client.get_model_version_by_alias(model_name, alias_name)
current_version = str(current.version)
# 读取候选版本,确认它已经注册,再进入发布变更记录。
candidate_version = "3"
candidate = client.get_model_version(model_name, candidate_version)
print({
"model_name": model_name,
"old_version": current_version,
"candidate_version": str(candidate.version),
"alias": alias_name,
})
这里的读取动作只负责取得注册中心元数据。候选版本是否满足业务指标、输入输出签名是否兼容,应由你的发布门禁负责;不要把“能够被 alias 指向”误认为“已经通过业务验收”。
把新版本指向 champion
切换 alias 使用 MlflowClient.set_registered_model_alias。它接收注册模型名、别名和目标版本号。下面的函数把旧版本作为返回值,便于调用方把它写入变更记录或后续回滚命令。
from mlflow import MlflowClient
def promote_to_champion(model_name: str, new_version: str) -> dict[str, str]:
client = MlflowClient()
alias_name = "champion"
# 切换前读取旧指针,回滚时仍然使用这个版本号。
old_info = client.get_model_version_by_alias(model_name, alias_name)
old_version = str(old_info.version)
# alias 是可移动指针;目标版本必须是该注册模型中的已存在版本。
client.set_registered_model_alias(model_name, alias_name, str(new_version))
# 再读取一次 alias,确认注册中心记录已经指向目标版本。
new_info = client.get_model_version_by_alias(model_name, alias_name)
return {
"model_name": model_name,
"alias": alias_name,
"old_version": old_version,
"new_version": str(new_info.version),
}
change = promote_to_champion("sales-model", "3")
print(change)
如果目标版本不存在,或客户端连接的 registry 与你查看的环境不是同一个,调用会失败。生产流程中应把返回的旧版本、新版本、发布人和变更单号保存下来,避免只依赖操作者的记忆。
推理端固定读取 champion
服务代码只需要使用 alias URI。MLflow 官方示例同时展示了 get_model_version_by_alias 和 models:/模型名@别名 两种读取方式;推理端更适合直接使用后者,让注册中心负责解析当前指针。
import mlflow.pyfunc
model_name = "sales-model"
alias_name = "champion"
# 使用 alias URI,避免把具体版本号耦合到推理代码。
model_uri = f"models:/{model_name}@{alias_name}"
model = mlflow.pyfunc.load_model(model_uri)
# data 应该符合注册模型记录的输入签名;这里不伪造业务数据。
prediction = model.predict(data)
return prediction
如果使用的是带有专用 flavor 的模型,也可以调用对应的 mlflow.。关键点是 URI 的尾部使用 @champion,而不是把某次发布的数字版本写死。
出现问题时怎样回滚
回滚不需要删除版本,也不需要重新注册旧模型。只要旧版本仍保留在同一个注册模型中,就把 champion 重新指向切换前保存的版本号。回滚动作与发布动作使用同一个 API,差别只有目标版本不同。
from mlflow import MlflowClient
def rollback_champion(model_name: str, rollback_version: str) -> dict[str, str]:
client = MlflowClient()
alias_name = "champion"
# 回滚前读取当前版本,保留这次反向变更的审计信息。
before = client.get_model_version_by_alias(model_name, alias_name)
# 将 alias 指回切换前保存的稳定版本,不删除任何模型版本。
client.set_registered_model_alias(model_name, alias_name, str(rollback_version))
# 读取最终指针,供变更记录和服务重载检查使用。
after = client.get_model_version_by_alias(model_name, alias_name)
return {
"model_name": model_name,
"alias": alias_name,
"before_version": str(before.version),
"after_version": str(after.version),
}
rollback = rollback_champion("sales-model", "2")
print(rollback)

回滚后,使用 alias URI 的新加载动作会解析到旧版本。若服务进程在启动时把模型加载到内存,是否需要重启或重新加载由你的服务实现决定;alias 更新本身不会替你刷新已经驻留内存的对象。
切换不生效时按三层排查
- 先看 registry 是否一致:确认切换脚本与推理服务使用相同的 MLflow tracking/registry 配置。不同环境的同名注册模型可能拥有完全不同的版本。
- 再看 alias 的实际指向:用
get_model_version_by_alias(model_name, "champion")读取当前版本;不要只看发布脚本是否返回成功。 - 最后看加载时机:如果服务只在启动时调用
load_model,注册中心的指针变化不会自动替换已经加载的 Python 对象,需要由服务提供重载、滚动发布或重新启动机制。 - 检查版本与权限:目标版本必须属于该注册模型,调用身份还需要具备修改 alias 的权限;不要通过删除旧版本来“强制回滚”。
一份可执行的切换清单
- 切换前读取并保存当前
champion指向的版本号。 - 确认候选版本已注册,并确认它的输入输出契约与服务兼容。
- 用
set_registered_model_alias将champion指向候选版本。 - 让服务继续使用
models:/模型名@champion,不要在代码中改数字版本。 - 把旧版本、新版本、registry URI 和变更记录一起保存。
- 出现异常时,用同一 API 把 alias 指回旧版本,再按服务的加载策略刷新内存模型。
相关问题
champion alias 和模型版本号应该同时写进推理 URI 吗?
通常不需要。固定版本号用于复现和审计,线上服务若要支持无代码切换,应使用 alias URI;需要复现某次结果时再显式加载数字版本。
回滚时要删除新模型版本吗?
不需要。回滚只是移动 alias 指针,保留新版本更利于复盘、再次发布或比较指标。
修改 alias 后服务一定会立刻切换吗?
不一定。如果服务已经把模型对象加载到内存,必须配合重新加载或滚动发布;alias 的变化不会自动改变现有 Python 对象。
PyTorch 怎样用 autocast 控制混合精度范围
- 上一篇
- PyTorch 怎样用 autocast 控制混合精度范围
- 下一篇
- Accelerate 怎样让多个进程分别绑定到不同 GPU
-
- 科技周边 · 人工智能 | 5分钟前 |
- 模型卡怎样记录训练数据和限制条件
- 400浏览 收藏
-
- 科技周边 · 人工智能 | 11分钟前 |
- Tokenizer 怎样处理超长输入的截断策略
- 500浏览 收藏
-
- 科技周边 · 人工智能 | 11分钟前 | LoRa Transformers PEFT merge_and_unload load_adapter adapter_config.json
- LoRA 适配器怎样与基础模型分离加载
- 102浏览 收藏
-
- 科技周边 · 人工智能 | 11分钟前 | python · Hugging Face Transformers generate tokenizer 新生成 token
- Hugging Face Transformers 怎样只输出生成结果而不带输入提示词
- 145浏览 收藏
-
- 科技周边 · 人工智能 | 17分钟前 | ai agent · 工具调用 · 最小权限 工具权限 Computer Use Holo4 计算机使用代理
- Holo4 这类计算机使用代理怎样划分工具权限
- 212浏览 收藏
-
- 科技周边 · 人工智能 | 18分钟前 | 人工智能 · vLLM KV Cache gpu-memory-utilization max-num-batched-tokens max-num-seqs 批处理显存
- vLLM 怎样限制批处理显存上限
- 265浏览 收藏
-
- 科技周边 · 人工智能 | 18分钟前 |
- RAG 检索结果怎样保留来源片段和页码
- 307浏览 收藏
-
- 科技周边 · 人工智能 | 19分钟前 | 分布式 · 人工智能 · 多进程 多GPU Accelerate CUDA_VISIBLE_DEVICES
- Accelerate 怎样让多个进程分别绑定到不同 GPU
- 444浏览 收藏
-
- 科技周边 · 人工智能 | 24分钟前 |
- PyTorch 怎样用 autocast 控制混合精度范围
- 248浏览 收藏
-
- 科技周边 · 人工智能 | 28分钟前 | AI工程 · 运行日志 Hugging Face Spaces Space日志 构建日志 fetch_space_logs
- Hugging Face Spaces 怎样查看应用运行日志
- 322浏览 收藏
-
- 科技周边 · 人工智能 | 47分钟前 | Hugging Face Transformers 半精度推理 float16 bfloat16
- Hugging Face Transformers 怎样为推理启用半精度
- 212浏览 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 543次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 516次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 500次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 485次学习
-
- PubMedQA
- 深入了解PubMedQA生物医学问答数据集,涵盖其核心功能、使用方法及在临床决策、药物研发等场景的应用,助力提升NLP模型性能。
- 932次使用
-
- H2O EvalGPT
- H2O EvalGPT是H2O.ai推出的开源LLM评估平台,提供详细的大模型性能排行榜、行业特定基准测试及A/B测试功能,助您快速选择最适合项目的高性能大语言模型。
- 937次使用
-
- LMArena
- LMArena是加州大学伯克利分校推出的AI模型匿名评测平台。通过盲测投票机制,用户可对比不同大模型回答并生成实时排行榜,助力开发者优化模型及用户选择最佳AI工具。
- 1046次使用
-
- HELM
- 深入了解斯坦福推出的HELM(Holistic Evaluation of Language Models)大模型评测体系。本文解析其核心功能、安装配置步骤及应用场景,涵盖准确性、公平性、鲁棒性等多维度指标,助力开发者全面优化语言模型性能。
- 1016次使用
-
- MMBench
- MMBench是由上海人工智能实验室等机构联合推出的多模态基准测试平台,提供细粒度能力评估、大规模数据集及VLMEvalKit工具。本文详细介绍其核心功能、安装使用方法及应用场景,助力开发者全面评估多模态模型性能。
- 844次使用
-
- CodeGeeX for Jetbrains IDEs正式上线!
- 2023-01-17 284浏览
-
- 技术阿里云实现ocr批量图片和pdf文件表格图片转换excel文档/支持票据图片提取/普通图片文字提取处理
- 2023-01-18 387浏览
-
- 直播预告|FeatureStore Meetup V2
- 2023-01-10 328浏览
-
- 深入浅出特征工程 – 基于 OpenMLDB 的实践指南(上)
- 2023-02-25 426浏览
-
- 开源机器学习数据库OpenMLDB v0.4.0产品介绍
- 2023-01-10 147浏览

