将特征商店整合到持续集成和持续交付(CI/CD)流程中,是实现可靠且敏捷MLOps实践的根本。手动更新特征定义、管理转换逻辑或部署变更的过程容易出错、产生不一致并导致延误,从而影响治理和血缘。自动化这些工作流程可确保变更经过系统测试、验证和部署,从而连接特征工程与生产机器学习 (machine learning)系统。
本节详细说明如何有效地将特征商店管理整合到自动化CI/CD工作流程中,涵盖了必要的阶段、测试策略和集成模式。
通过CI/CD自动化特征生命周期
目标是将特征定义及相关转换代码视为版本控制系统(如Git)中的重要组成部分,并对其进行与应用程序代码相同的严格管理。通过CI/CD管理的重要组件包括:
- 特征定义: 模式变更、新特征添加、元数据更新(描述、所有者、标签)。
- 转换逻辑: 实现特征计算的代码(例如,Python函数、Spark作业、SQL查询)。
- 验证规则: 用于数据质量检查和偏差检测的配置。
- 基础设施配置: 如果使用基础设施即代码(IaC)来管理特征商店资源(例如,数据库、计算资源)。
当这些组件的变更提交到版本控制时,自动化流程应被触发,以处理验证、测试和部署过程。
特征商店集成的核心流程阶段
一个典型的特征商店变更CI/CD流程可能包含以下阶段:
- 触发: 由针对存放特征定义或转换代码的仓库中特定分支(例如
main或develop)的提交或合并请求启动。
- 构建与静态分析:
- 打包转换代码(如果适用)。
- 对转换脚本运行代码检查工具和静态代码分析器。
- 验证特征定义文件(例如YAML、JSON或特定DSL)的语法和结构。
- 单元测试:
- 执行任何自定义特征转换函数或类的单元测试。这些测试应独立验证逻辑,通常使用模拟数据。
- 集成测试(预生产环境):
- 将提议的变更(新的/更新的特征定义、转换逻辑)部署到专用的预生产或开发特征商店环境。
- 运行集成测试以验证:
- 与特征商店的连接性。
- 通过特征商店SDK/API注册/更新特征定义的能力。
- 转换逻辑对样本数据的成功执行,可能触发测试摄入作业。
- 使用更新的定义进行基本特征检索。
- 数据验证测试(预生产环境):
- 使用新的/更新的特征和转换,将一小批有代表性的数据摄入到预生产环境。
- 对新摄入的预生产数据运行预定义的数据验证规则(例如,使用Great Expectations、
pandera或内置特征商店功能)。
- 对照参考数据集检查模式一致性、统计属性以及潜在的在线/离线偏差。
- 审批关卡(可选):
- 暂停流程进行人工审核和批准,特别是对于影响重要特征或需要跨团队批准的重大变更。这将人工监督整合到自动化流程中。
- 部署(生产环境):
- 将经过验证的变更部署到生产特征商店环境。这可能涉及:
- 使用特征商店的SDK或CLI应用特征定义更新。
- 部署新版本的转换作业(例如,更新Spark应用程序、部署Docker镜像)。
- 部署后检查:
- 对生产环境运行冒烟测试,以确保基本功能(例如,可以检索新更新的特征)。
- 部署后立即监控主要指标(延迟、错误率、数据新鲜度)。
流程中的测试策略
有效的测试对于可靠的特征商店CI/CD很重要。专注于特征生命周期特有的测试:
- 模式验证: 确保特征定义符合预期结构,数据类型有效,并且所需的元数据存在。使用模式验证工具或自定义脚本。
- 转换逻辑测试: 单元测试对于复杂的转换必不可少。测试边界情况、空值处理和预期的输出格式。
- 数据契约测试: 验证转换作业的输出是否符合特征商店中定义的模式。这些测试可以在数据验证阶段运行。
- 时间点正确性测试: 对于重要特征,在预生产环境中加入模拟历史查询的测试,以验证时间点连接逻辑。
- 特征检索测试: 尝试使用预期实体ID获取新定义或更新特征的简单测试,确保服务层在变更后正常运行。
特征更新的部署策略
部署对特征定义或转换逻辑的变更需要仔细考虑,因为下游模型依赖于它们:
- 向后兼容性: 尽可能争取向后兼容的变更(例如,添加新特征)。破坏性变更(例如,更改特征的数据类型、移除特征)需要与模型部署流程仔细协调。
- 版本控制: 使用前面讨论的特征版本控制功能。CI/CD流程应自动化新特征版本的创建和注册。
- 分阶段发布: 对于重要更新,可以考虑分阶段发布(例如,部署新的转换逻辑版本以首先计算部分实体的特征)或蓝绿部署,即新版本并行运行,然后才完全切换。特征商店的架构可能会影响这些策略的可行性。
工具与集成模式
Jenkins、GitLab CI、GitHub Actions、CircleCI或Argo Workflows等标准CI/CD平台可以编排这些流程。这种集成通常涉及:
- 特征商店SDK/CLI: 在流程脚本(例如Python、Bash)中使用特征商店提供的软件开发工具包(SDK)或命令行界面(CLI)来与特征商店API交互(注册特征、触发作业、运行验证)。
- 基础设施即代码(IaC): 如果特征商店组件是自行管理的,Terraform或CloudFormation等工具可以管理底层基础设施(数据库、计算集群)。IaC配置的变更也会触发相关的CI/CD流程。
- 容器化: 将转换逻辑和测试工具打包到Docker容器中,确保本地开发、CI运行器和生产环境之间执行环境的一致性。
典型的CI/CD流程,用于管理特征商店工件。变更在部署前会触发自动化的构建、测试和验证阶段。
挑战与考量
- 依赖管理: 特征的变更可能导致下游模型中断。将特征商店CI/CD与模型CI/CD流程集成很重要。特征版本需要与模型版本关联。
- 回滚复杂性: 回滚特征定义变更或转换逻辑可能很复杂,特别是如果数据已使用有问题的版本摄入。策略通常涉及向前部署更正的版本,而不是真正回滚数据。
- 环境一致性: 保持开发、预生产和生产特征商店环境之间的一致性很困难,但对于可靠的测试是必要的。
- 流程执行时间: 全面验证,特别是涉及预生产环境中的数据处理时,可能会使流程变慢。优化测试并可能减少运行成本更高的验证检查的频率(例如,每晚运行而不是每次提交都运行)。
连接CI/CD与治理
CI/CD流程是您治理策略的执行机制。通过嵌入 (embedding)检查并要求特定测试通过,您可以确保:
- 只注册有效的特征定义。
- 转换代码符合质量标准。
- 数据验证规则得到一致应用。
- 重要变更遵循审批工作流。
- 变更可通过版本控制历史和流程日志进行审计。
将特征商店与CI/CD流程集成,将特征管理从手动、易错的任务转变为一个精简、自动化和受治理的过程。这种自动化是成熟MLOps的根基,使得团队能够可靠、快速地改进其特征,同时保持生产环境的稳定性和可控性。