MLOps Zoomcamp 2024 单元三:基于 Mage 构建端到端 ML 流水线的 MLOps 实战指南
【免费下载链接】mlops-zoomcampFree MLOps course from DataTalks.Club. Register here 👇🏼 to get notified about the next cohort项目地址: https://gitcode.com/GitHub_Trending/ml/mlops-zoomcamp
本文基于 MLOps Zoomcamp(DataTalks.Club 免费 MLOps 课程)2024 届第 3 单元「Orchestration and ML Pipelines」的课程文档展开,完整覆盖该单元从 MLOps 概念、Mage 环境启动,到数据准备(ETL 与特征工程)、sklearn/XGBoost 双模型训练、可观测性(监控与告警)、推理与再训练触发,再到生产部署和课后作业的全流程。读完本文,你可以按 2024 届的课程脉络,用 Mage 搭建一条带数据校验、实验追踪(MLflow)、SHAP 解释性和 CI/CD 的端到端 ML 流水线,并知道每个环节对应的代码块与配置文件在哪里。
模块定位与整体结构
2024 届的单元 3 是课程中「工作流编排」主题的教学单元,模块编号与标题定义在 meta.json 中(module.number = 3,module.title = "Orchestration and ML Pipelines")。单元索引页 cohorts/2024/03-orchestration/README.md 将课程拆成六个递进的小节:
| 小节 | 主题 | 文档位置 |
|---|---|---|
| 3.0 | 引言:ML Pipelines 与 Mage | 3.0/README.md |
| 3.1 | 数据准备:ETL 与特征工程 | 3.1/README.md |
| 3.2 | 训练:sklearn 模型与 XGBoost | 3.2/README.md |
| 3.3 | 可观测性:监控与告警 | 3.3/README.md |
| 3.4 | 触发:推理与再训练 | 3.4/README.md |
| 3.5 | 部署:在生产环境运行 | 3.5/README.md |
| 3.6 | 作业 | homework.md |
从文档结构可以看出 2024 届的技术选型:编排平台从 2022/2023 届的 Prefect(见 2022 版说明 与 2023 版说明)切换为 Mage。单元索引页的「Notes」部分也明确保留了历届学习资料的入口,并列出社区贡献的 Ch3 学习笔记,体现了课程文档「历届对比 + 社区共建」的组织方式。
所有小节配套的可运行代码存放在课程协作仓库mage-ai/mlops中(下文各节给出的data_loaders/、transformers/等文件路径均指该协作仓库内的子项目unit_3_observability),本仓库中保留的是各小节的教学说明与配置清单。
3.0 引言:MLOps 概念与 Mage 环境启动
MLOps 的四步生命周期
3.0/README.md 先给出课程对 MLOps 的定义:
Operationalizing ML models involves moving them from development to production to drive business value. (将 ML 模型从开发推向生产以驱动业务价值,即为模型运维化。)
文档将这一过程拆为四步:
- Step 1 准备模型:优化性能、确保模型能处理真实世界数据、打包以便集成进现有系统;
- Step 2 部署模型:从开发环境迁移到生产环境,使其对用户和应用可访问;
- Step 3 持续监控:部署后必须持续监控准确性与可靠性,必要时用新数据再训练、更新模型;
- Step 4 融入业务流程:把运维化的模型接入现有工作流、应用与决策过程,产生业务影响。
文档同时给出组织层面做 MLOps 的四个理由,这也是后续各环节设计的依据:
- Productivity(生产力):为数据科学家、ML 工程师和 DevOps 提供统一的实验追踪、特征工程、模型管理与部署环境,打破团队壁垒、加速 ML 全生命周期;
- Reliability(可靠性):通过干净的数据集、充分的测试与验证、CI/CD 实践、监控和治理,保证生产模型质量;
- Reproducibility(可复现性):对数据集、代码和模型做版本管理,提供透明度与可审计性,满足政策合规;
- Time-to-value(价值交付速度):简化 ML 生命周期,让更多项目成功上生产,规模化获得 AI/ML 投资回报。
Mage 在 MLOps 中的三个作用
文档随后说明 Mage 平台如何支撑上述目标:
- 数据准备:构建、运行和管理数据管道,包括流水线编排、notebook 环境、数据集成、面向实时数据的流式管道;
- 训练与部署:准备数据、训练 ML 模型,并以可访问的 API 端点部署;
- 标准化复杂流程:用统一平台覆盖数据管道、模型开发、部署、版本管理、CI/CD 与维护,让开发者专注模型本身。
快速启动 Mage
3.0 小节提供了完整的 Quick Start 命令。克隆包含本模块全部代码的协作仓库并进入目录:
git clone https://github.com/mage-ai/mlops.git cd mlops启动 Mage 与 PostgreSQL 数据库服务:
./scripts/start.sh如果环境没有 bash,文档给出等价的docker compose命令(注意PROJECT_NAME、MAGE_CODE_PATH和 SMTP 变量的写法):
PROJECT_NAME=mlops \ MAGE_CODE_PATH=/home/src \ SMTP_EMAIL=$SMTP_EMAIL \ SMTP_PASSWORD=$SMTP_PASSWORD \ docker compose up文档特别提示:若出现The "PYTHONPATH" variable is not set. Defaulting to a blank string.警告,可以忽略。
启动成功后,示例项目位于子项目unit_3_observability(包含全部管道与代码)。运行示例管道的操作步骤为:
- 浏览器打开
http://localhost:6789; - 在左上角 Mage logo 与
mlops项目名旁的项目选择下拉框中,选择unit_0_setup选项; - 点击名为
example_pipeline的管道; - 点击
Run @once按钮执行一次。
这一「Docker 一键拉起 + 网页 IDE 运行」的模式贯穿整个单元:后续所有小节都在这个本地 Mage 实例中开发管道,避免了手工搭建编排引擎的运维负担。
3.1 数据准备:ETL 与特征工程
3.1/README.md 讲解如何用 Mage 的 block 体系搭建数据准备管道,对应协作仓库中的子项目unit_1_data_preparation。
创建项目与摄取(Ingestion)
创建 Mage 项目的操作路径是:在 Text editor(命令中心输入 "text editor" 打开)中右键一个文件夹,选择New Mage project,再到Settings中点击Register project完成注册。
注册后项目内是一个空管道,课程要求用 block 逐步开发。第一个 block 是ingestion block,用 Python 代码下载 Green taxi 数据集 1~3 月的 parquet 文件并拼接,同时生成用于数据画像(data profiling)的图表。课程使用的代码文件为data_loaders/ingest.py,文档还给出一个常见坑的修复:如果时间轴图表不显示,在ingest.py的dfs.append(df)一行上方插入:
df['lpep_pickup_datetime_cleaned'] = df['lpep_pickup_datetime'].astype(np.int64) // 10**9这段代码把纳秒时间戳转回秒级,解决 pandas 时间列在可视化中的显示问题。
通用工具函数(Utility helpers)
utils目录下预置了三个工具模块,供后续 transformer block 导入使用:
utils/data_preparation/cleaning.py:数据清洗;utils/data_preparation/feature_selector.py:特征选择;utils/data_preparation/splitters.py:训练/验证集切分。
这种「工具函数与管道 block 分离」的组织方式让同一份逻辑可被多条管道复用,是 2024 届课程强调的工程习惯。
数据准备 block 与可视化
数据准备阶段的代码在transformers/prepare.py。文档给出一条实操提示:要让直方图正确显示,需把默认绘图代码的最后两行改为:
col = 'trip_distance' x = df_1[df_1[col] <= 20][col]即把trip_distance截断到 20 以内再画分布,避免极端值压扁直方图。
构建训练集与数据校验
构建训练集依赖两个文件:
utils/data_preparation/encoders.py:类别特征编码(PULocationID/DOLocationID 等);data_exporters/build.py:导出训练/验证数据集。
该小节还引入 Mage 内置测试框架(built-in testing framework)做数据校验,data_exporters/build.py中即包含数据校验(data validation)的写法,保证导出数据集的行数、取值范围等约束在每次运行时被检查。整条数据准备管道的拓扑与调度配置记录在pipelines/data_preparation/metadata.yaml中——这也是 Mage「配置即代码」的体现:管道结构(block 依赖、触发器)保存在 YAML,可进版本库审查。
3.2 训练:sklearn 模型与 XGBoost
3.2/README.md 讲解如何把「训练」本身也编排成管道,课程并行搭建了两条训练管道:sklearn 与 XGBoost。
sklearn 训练管道
课程按如下顺序搭 block:
- GDP 训练集:使用 Global Data Product(GDP,Mage 跨管道共享数据集的机制)消费 3.1 产出的训练集,避免重复计算;
- 动态加载模型:
custom/load_models.pyblock 负责动态加载 sklearn 模型类,配合utils/models/sklearn.py中封装的模型工具; - 超参数调优:
transformers/hyperparameter_tuning/sklearn.py执行调参(本单元依赖清单 requirements.txt 中包含hyperopt==0.2.7,即调参用的贝叶斯优化库); - 训练模型:
transformers/下的训练 block 用最优超参训练; - 导出模型:
data_exporters/sklearn.py保存模型产物。
两条训练管道共享的超参定义放在utils/hyperparameters/shared.py,保证 sklearn 与 XGBoost 管道对「什么是好的搜索空间」有一致的约定。
XGBoost 训练管道
XGBoost 管道结构与 sklearn 对称,关键文件为:
utils/models/xgboost.py:模型工具封装;transformers/hyperparameter_tuning/xgboost.py:XGBoost 超参搜索;data_exporters/xgboost.py:模型导出。
两条管道的编排配置分别保存在pipelines/sklearn_training/metadata.yaml与pipelines/xgboost_training/metadata.yaml。从源码结构看,这种「每个模型族一条独立管道 + 共享 utils + 共享超参定义」的设计,使得后续 3.3/3.4 小节可以为两条管道分别挂监控、解释性和再训练触发器,互不干扰。
3.3 可观测性:监控与告警
3.3/README.md 覆盖四类可观测性能力。
1. 管道健康监控
课程先查看 sklearn 训练管道的运行健康状态:block 级成功率、运行时长、数据行数等运行记录在 Mage 的运行历史中可见。这是「管道级」监控,回答「训练是不是按时、按量跑完了」。
2. 模型可解释性(SHAP 仪表盘)
解释性部分是本小节的技术亮点,涉及协作仓库中的以下文件:
custom/dashboard_data_source.py:产生计算与绘制 SHAP 值所需的输出;charts/shap_values.py:SHAP 值图表;charts/shap_values_bar.py:SHAP 条形图(特征重要性排序);charts/shap_values_force_chart.py:SHAP force plot(单样本预测解释)。
课程演示了自定义 dashboard 布局(Customize layout),把 SHAP 图表组合成 XGBoost 解释性仪表盘。布局文件位于presenters/pipelines/<pipeline_name>/dashboard/block_layout.yaml(文档中给出了xgboost_training与sklearn_training两个 dashboard 的block_layout.yaml路径)。
3. 模型性能仪表盘
项目级总览仪表盘回答「哪次训练最好、指标如何漂移」,涉及图表 block:
charts/training_metrics__rmse_.py:RMSE 时序图;charts/time_series__mse_.py:MSE 时序图;charts/distribution_of_performance_metrics.py:性能指标分布直方图;charts/total_runs_by_model.py:按模型统计训练次数(条形/饼图);utils/analytics/data.py:供各仪表盘共用的分析数据工具。
仪表盘配置保存在presenters/overview/dashboard/block_layout.yaml。
4. 告警(Alerting)
告警配置写在项目级metadata.yaml(协作仓库路径unit_3_observability/metadata.yaml),并配合项目设置中的 SMTP(邮件)发送配置。文档列出了 Mage 支持的告警通道:Email、Opsgenie、Slack、Teams、Discord、Telegram,覆盖了「管道运行状态触发 → 推送到值班渠道」的完整链路。
3.4 触发:推理与再训练
3.4/README.md 讲解管道的「触发」能力,即让流程自动化闭环。
再训练管道(Retraining pipeline)
关键 block 有三个:
sensors/detect_new_data.py:传感器 block,检测是否有新数据到位;custom/retrain/sklearn.py:触发 sklearn 训练管道;custom/retrain/xgboost.py:触发 XGBoost 训练管道。
从源码结构看,这是一条典型的「数据驱动再训练」管道:sensor 检测到新数据 → 触发对应模型族的训练管道,实现 MLOps 四步中「持续监控并再训练」环节的自动化。再训练管道的编排配置在pipelines/automatic_retraining/metadata.yaml。
推理管道(Inference pipeline)
custom/inference.py:推理 block,加载模型并对输入做预测;- 管道配置在
pipelines/predict/metadata.yaml; - 课程还演示了Playground交互式界面:无代码 UI 交互配置在
interactions/playground.yaml,可以直接在界面上输入特征获得预测,也可以通过 Mage 的 API 端点拿到预测结果——这意味着推理能力既可以人工交互调试,也可以作为服务被程序调用。
文档同时整理了 Mage 触发机制的四种方式(在 Mage 官方文档中可查到对应章节):在代码中保存触发器、从 block 触发另一条管道、通过 API 端点触发、按周期调度运行。这四类触发器正是 3.4 两条管道的底层机制。
3.5 部署:在生产环境运行
3.5/README.md 把前面所有管道放进生产视角,分三步。
1. 权限(AWS IAM)
custom/permissions.pyblock 用于演示在 AWS 上配置 Mage 部署所需的 IAM 权限。课程强调生产部署前必须先解决「这个身份能做什么」的问题,对应的 IAM 策略分为 Terraform apply 与 Terraform destroy 两类权限。
2. 部署与销毁(Terraform)
部署流程本身也被编排成管道,由三个 block 组成:
custom/infrastructure_setup.py:执行 Terraform 初始化/初始化云环境;custom/deploy.py:执行部署(terraform apply);custom/teardown_deployed_resources.py:销毁已部署资源(terraform destroy),避免遗留资源产生费用。
整条部署管道的编排配置在pipelines/deploying_to_production/metadata.yaml。
3. CI/CD
custom/ci_and_cd.pyblock 演示用 GitHub Actions 做持续集成与持续部署:代码变更 → 触发 CI 校验 → 通过 Mage 部署流程发布。文档给出的资源清单涵盖仓库配置、AWS IAM 策略(apply/destroy 两份)、Terraform 配置与 CI/CD 概览,构成了「部署流水线即代码」的完整闭环。
作业实战:用 Mage + MLflow 完成一次完整训练闭环
cohorts/2024/03-orchestration/homework.md 是本单元的能力验收:目标是用 Mage 搭建一条简单的训练管道,用 MLflow 追踪实验并注册最优模型。数据集沿用课程的 NYC taxi 数据,作业指定使用Yellowtaxi 2023 年 3 月数据。六个问题覆盖了单元核心技能:
- Q1 运行 Mage:按 Quick Start 用 Docker Compose 启动,回答 UI 中看到的 Mage 版本;
- Q2 创建项目:新建名为
homework_03的项目,回答生成的metadata.yaml行数(35/45/55/65 四选一),考察是否真正创建并查看了项目配置; - Q3 创建摄取 block:读取 2023 年 3 月 Yellow taxi 数据,回答加载的记录数;
- Q4 数据准备:写一个 transformer block,课程给出了调整自 Green 版逻辑的参考实现(见 homework.md):
def read_dataframe(filename): df = pd.read_parquet(filename) df.tpep_dropoff_datetime = pd.to_datetime(df.tpep_dropoff_datetime) df.tpep_pickup_datetime = pd.to_datetime(df.tpep_pickup_datetime) df['duration'] = df.tpep_dropoff_datetime - df.tpep_pickup_datetime df.duration = df.duration.dt.total_seconds() / 60 df = df[(df.duration >= 1) & (df.duration <= 60)] categorical = ['PULocationID', 'DOLocationID'] df[categorical] = df[categorical].astype(str) return df逻辑要点:把上下车时间转 datetime、计算以分钟为单位的duration、过滤 1~60 分钟的行程、把上下车地点 ID 转字符串以便后续字典编码; 5.Q5 训练模型:与单元 2 作业一致——fit 一个 dict vectorizer,训练默认参数的线性回归,pickup/dropoff 地点分开使用(不做组合特征),返回 vectorizer 与 model,回答模型截距(intercept); 6.Q6 注册模型:停止 Mage(Ctrl+C或docker-compose down),为 MLflow 单独建一个容器并与 Mage 同网络。文档给出了完整的mlflow.dockerfile:
FROM python:3.10-slim RUN pip install mlflow==2.12.1 EXPOSE 5000 CMD [ \ "mlflow", "server", \ "--backend-store-uri", "sqlite:///home/mlflow_data/mlflow.db", \ "--host", "0.0.0.0", \ "--port", "5000" \ ]以及 docker-compose.yaml 中要追加的服务(注意app-network必须与 mage、postgres 容器同网络):
mlflow: build: context: . dockerfile: mlflow.dockerfile ports: - "5000:5000" volumes: - "${PWD}/mlflow_data:/home/mlflow_data/" networks: - app-network重启 compose 后,MLflow 服务在http://mlflow:5000可达(容器网络内的主机名即服务名mlflow)。作业要求在 Mage 项目中安装mlflow==2.12.1,然后创建一个data exporter block:记录线性回归模型(log model),并保存与上传 dict vectorizer 作为 artifact(log artifact)。最后查看 MLflow 中的 MLModel 文件,回答model_size_bytes的值。文档还提示:最后两步(log model 与 log artifact)通常放在同一个代码 block 内完成。
这份作业把「摄取 → 准备 → 训练 → 注册」四个环节压进一条 Mage 管道,且 MLflow 以独立容器接入,正是 3.2 训练管道与单元 2 实验追踪知识的综合应用。
环境依赖与历届资料对照
2024 届依赖清单
cohorts/2024/03-orchestration/requirements.txt 锁定了本单元使用的关键依赖:
| 依赖 | 版本 | 用途 |
|---|---|---|
mlflow | 2.3.1 | 实验追踪与模型注册(作业中单独起服务时用 2.12.1,注意以作业说明为准) |
hyperopt | 0.2.7 | 3.2 小节的超参数调优 |
xgboost | 1.7.5 | XGBoost 训练管道 |
scikit_learn | 1.2.2 | sklearn 训练管道 |
pandas/fastparquet | 2.0.1 / 2023.4.0 | 数据读取与处理 |
seaborn | 0.12.2 | 数据画像与指标可视化 |
prefect/prefect-aws | 2.10.8 / 0.3.1 | 从 2023 届沿用下来的历史依赖,2024 届正文已不再使用 Prefect |
black/orjson | 23.3.0 / 3.8.1 | 代码格式化 / 高速 JSON 序列化 |
从依赖清单结构可以推断:requirements.txt是从 2023 届(Prefect 单元)延续维护的,2024 届实际教学改用了 Mage,其中prefect相关条目属于历史遗留;动手时建议按各小节实际用到的包安装。
与其他届的对照
- 2022 届与 2023 届的同主题单元使用 Prefect,可参考 cohorts/2022/03-orchestration/README.md 和 cohorts/2023/03-orchestration/prefect/README.md(含 Prefect 本地服务器启动、Prefect Cloud 登录等操作步骤);
- 当前主线(2025 届)的编排单元改为了「自主选择编排工具」的开放式练习,工具清单包含 Airflow、Prefect、Dagster、Kestra、Mage 等,并给出了参数化调度(月度运行、训练/验证数据取前两个月)、backfill 等要求,见 03-orchestration/README.md;其中也保留了与本作业一致的 MLflow Docker 部署方案。
小结
2024 届第 3 单元用 Mage 串起了 MLOps 的完整闭环:3.0建立 MLOps 四步生命周期认知并用 Docker 一键启动编排环境;3.1用 ingestion/transformer/exporter 三类 block 完成 ETL、特征工程与数据校验;3.2把 sklearn 与 XGBoost 的训练、调参、导出本身编排成管道,并用metadata.yaml固化管道拓扑;3.3从管道健康、SHAP 可解释性、性能仪表盘到多渠道告警,补齐可观测性;3.4用 sensor 与 trigger 实现「新数据到位 → 自动再训练」与可交互/可 API 化的推理;3.5用 IAM 权限、Terraform 部署/销毁和 GitHub Actions CI/CD 收口到生产。配合 homework.md 的 Mage + MLflow 六问练习,该单元提供了从本地实验到生产运维、且每个环节都可代码化、可复现的完整 MLOps 教学路径。
【免费下载链接】mlops-zoomcampFree MLOps course from DataTalks.Club. Register here 👇🏼 to get notified about the next cohort项目地址: https://gitcode.com/GitHub_Trending/ml/mlops-zoomcamp
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考