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 层根据策略(如按流量比例、按标签)拉取指定版本的模型。
设计要点: 注册中心应支持多租户隔离(策略组/产品线),每个租户拥有独立的命名空间,避免版本号冲突。
模型注册中心核心架构图 模型注册中心核心架构 训练平台 / CI 流水线 模型注册中心 版本控制引擎 元数据库 模型仓库 服务发现 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 可见性:

  1. Draft(草稿):模型刚上传,仅限开发人员调试,不对外服务。
  2. Staging(预发布):通过单元测试与回测验证,可被灰度调度器选中进行小流量测试(如 1% 流量)。
  3. Production(生产):经过灰度验证,正式全量上线,所有流量均可路由至此版本。
  4. Deprecated(弃用):新版本已上线,旧版本仍可服务但不再接收新流量,等待存量连接耗尽。
  5. Archived(归档):完全下线,仅保留元数据用于追溯,模型文件可移至冷存储。
模型版本状态流转图 模型版本状态流转 Draft Staging 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 层加载模型。