3. 模型版本管理:模型注册中心设计、版本号规范、元数据存储
在量化策略灰度发布体系中,模型版本管理是连接离线训练与在线推理的桥梁。一个设计良好的模型注册中心,能够确保每次策略迭代都可追溯、可回滚、可灰度。本节将围绕注册中心的核心架构、版本号语义规范以及元数据存储模型展开。
3.1 模型注册中心整体架构
模型注册中心作为中央元数据存储与版本控制枢纽,承担着模型上传、版本注册、状态流转、元数据查询等职责。其核心组件包括:
- 模型仓库(Model Repository):存储模型二进制文件(如 ONNX、Pickle、TensorFlow SavedModel),通常对接对象存储(S3/MinIO)或分布式文件系统。
- 元数据库(Metadata DB):记录每个模型的版本号、状态、特征版本、训练时间、评估指标等结构化信息,常用 PostgreSQL 或 MySQL。
- 版本控制引擎(Versioning Engine):管理版本号的生成、递增、状态转换(如 Draft → Staging → Production → Archived)。
- 服务发现接口(Service Discovery API):供 Serving 层根据策略(如按流量比例、按标签)拉取指定版本的模型。
设计要点: 注册中心应支持多租户隔离(策略组/产品线),每个租户拥有独立的命名空间,避免版本号冲突。
3.2 版本号规范:语义化版本 + 灰度标签
量化策略模型版本号采用 语义化版本(SemVer) 扩展规范,格式为:MAJOR.MINOR.PATCH[-灰度标签][+构建元数据]。各段含义如下:
| 字段 | 示例 | 变更触发条件 | 灰度影响 |
|---|---|---|---|
| MAJOR | 2 | 策略逻辑重构、因子体系变更、不兼容回测结果 | 需全量灰度验证,通常伴随新流量分组 |
| MINOR | 5 | 新增因子、调整参数范围、优化特征工程 | 可小流量灰度(5%~20%) |
| PATCH | 3 | Bug 修复、性能优化、依赖升级,策略逻辑不变 | 可快速全量上线,灰度观察期缩短 |
| 灰度标签 | rc.1 / beta.2 | 发布候选、内测、公测阶段 | 明确标识未正式发布的版本 |
| 构建元数据 | +20250315 | 每次 CI 构建自动追加时间戳 | 仅用于追溯,不参与版本比较 |
最佳实践: 在灰度发布场景中,建议将
MAJOR.MINOR.PATCH 作为不可变标识,一旦发布即禁止修改。灰度标签(如 -rc.1)允许在同一个 PATCH 版本内多次迭代。
3.3 元数据存储模型
元数据是模型注册中心的核心资产,每条模型版本记录应包含以下字段。设计时需兼顾查询效率与扩展性:
| 分类 | 字段名 | 类型 | 说明 |
|---|---|---|---|
| 基础标识 | model_id | VARCHAR(64) | 模型唯一标识,如 alpha_factor_v3 |
| version | VARCHAR(32) | 完整版本号,如 2.5.3-rc.1+20250315 |
|
| status | ENUM | Draft / Staging / Production / Archived / Deprecated | |
| 模型类型 | model_type | VARCHAR(32) | XGBoost / LSTM / Transformer / 线性回归等 |
| framework | VARCHAR(32) | 训练框架,如 sklearn / tensorflow / pytorch | |
| runtime | VARCHAR(32) | 推理运行时,如 ONNX / Triton / TFServing | |
| 特征版本 | feature_set_id | VARCHAR(64) | 特征集标识,关联特征仓库 |
| feature_version | VARCHAR(16) | 特征版本号,如 v3.2 |
|
| 时间戳 | training_time | DATETIME | 训练完成时间(UTC) |
| registered_time | DATETIME | 注册到中心的时间 | |
| 评估指标 | metrics | JSON | 存储 Sharpe、最大回撤、年化收益等 |
| dataset_hash | VARCHAR(64) | 训练数据集指纹,用于数据溯源 |
注意: 特征版本(feature_version)必须与模型版本严格绑定。若特征版本升级但模型版本未变,可能导致线上推理时特征对齐错误。建议在 CI 流水线中强制校验特征版本一致性。
3.4 版本状态流转与灰度策略
模型版本在注册中心内经历明确的状态机流转,每个状态对应不同的 Serving 可见性:
- Draft(草稿):模型刚上传,仅限开发人员调试,不对外服务。
- Staging(预发布):通过单元测试与回测验证,可被灰度调度器选中进行小流量测试(如 1% 流量)。
- Production(生产):经过灰度验证,正式全量上线,所有流量均可路由至此版本。
- Deprecated(弃用):新版本已上线,旧版本仍可服务但不再接收新流量,等待存量连接耗尽。
- Archived(归档):完全下线,仅保留元数据用于追溯,模型文件可移至冷存储。
3.5 元数据存储 SQL 示例
以下为模型注册中心元数据表的 DDL 示例(PostgreSQL 方言),涵盖核心字段与索引设计:
CREATE TABLE model_registry (
id BIGSERIAL PRIMARY KEY,
model_id VARCHAR(64) NOT NULL,
version VARCHAR(32) NOT NULL,
status VARCHAR(16) NOT NULL DEFAULT 'Draft'
CHECK (status IN ('Draft','Staging','Production','Deprecated','Archived')),
model_type VARCHAR(32),
framework VARCHAR(32),
runtime VARCHAR(32),
feature_set_id VARCHAR(64),
feature_version VARCHAR(16),
training_time TIMESTAMPTZ,
registered_time TIMESTAMPTZ NOT NULL DEFAULT NOW(),
metrics JSONB,
dataset_hash VARCHAR(64),
artifact_path TEXT, -- 模型文件在对象存储中的路径
created_by VARCHAR(64),
description TEXT,
UNIQUE (model_id, version)
);
-- 常用查询索引
CREATE INDEX idx_model_status ON model_registry (model_id, status);
CREATE INDEX idx_model_feature ON model_registry (feature_set_id, feature_version);
CREATE INDEX idx_training_time ON model_registry (training_time DESC);
工程建议: 对于高并发查询场景(如 Serving 层每秒拉取版本信息),可在元数据库前增加 Redis 缓存,缓存 key 设计为
model:{model_id}:version:{version},TTL 设置为 60 秒,降低数据库压力。
3.6 灰度发布中的版本选择策略
在灰度发布时,Serving 层根据注册中心提供的版本元数据,结合流量路由规则,决定每个请求使用哪个模型版本。常见策略包括:
- 按流量比例:例如 90% 流量使用 Production 版本,10% 流量使用 Staging 版本。注册中心需返回版本的状态与权重。
- 按请求标签:根据请求中的用户 ID、策略组、地域等标签,路由到指定版本。元数据中需存储版本适用的标签规则。
- 按时间窗口:在特定时间段内(如回测验证期)使用候选版本,过期后自动回退。
注册中心应提供 resolve_version(model_id, routing_context) 接口,返回最匹配的版本号及其 artifact_path,供 Serving 层加载模型。