ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

MLOps Zoomcamp 2024 实验跟踪作业实战:用 MLflow 完成出租车时长预测、超参调优与模型注册全流程

MLOps Zoomcamp 2024 实验跟踪作业实战:用 MLflow 完成出租车时长预测、超参调优与模型注册全流程 MLOps Zoomcamp 2024 实验跟踪作业实战用 MLflow 完成出租车时长预测、超参调优与模型注册全流程【免费下载链接】mlops-zoomcampFree MLOps course from DataTalks.Club. Register here to get notified about the next cohort项目地址: https://gitcode.com/GitHub_Trending/ml/mlops-zoomcamp本篇基于 2024 届第 2 周作业文档 展开完整覆盖从安装 MLflow、预处理 Green Taxi 数据、autolog 训练 RandomForest到本地部署 tracking server、hyperopt 超参调优和将最优模型推送到模型注册表的全部 6 个练习。读完本篇你可以按照仓库中的脚本独立完成整个实验跟踪Experiment Tracking与模型管理Model Registry闭环并理解每个练习背后对应的仓库源码实现。1. 作业目标与 Q1安装 MLflow该作业的官方目标是熟悉 MLflow——一个用于实验跟踪与模型管理的工具。整个作业围绕一个真实的回归任务展开使用Green Taxi Trip Records数据集预测每次行程的时长duration。Q1 要求安装 MLflow 的 Python 包并验证版本文档建议创建一个独立的 Python 环境例如使用 conda 环境再通过pip或conda在其中安装 MLflow安装完成后执行mlflow --version查看输出并在交卷时报告自己的版本号。这是一个刻意设置的入门步骤后续所有脚本训练、调参、注册都依赖mlflow包提供的autolog、start_run、MlflowClient等 API版本差异也可能影响 UI 展示与注册表行为因此先固定并记录版本。2. Q2下载与预处理数据preprocess_data.py 源码解析Q2 要求下载 2023 年 1 月、2 月、3 月的 Green Taxi Trip Records parquet 数据来源于 NYC TLC 官方发布页然后运行作业脚本python preprocess_data.py --raw_data_path TAXI_DATA_FOLDER --dest_path ./output文档提示执行前先进入02-experiment-tracking/homework/目录即本仓库的 homework 目录并把TAXI_DATA_FOLDER替换为你实际存放数据的位置。该脚本会完成三件事从TAXI_DATA_FOLDER加载数据、在训练集2023 年 1 月上拟合一棵DictVectorizer、把预处理后的数据集与DictVectorizer保存到磁盘。结合 preprocess_data.py 源码可以看到脚本的具体行为数据加载与清洗read_dataframe函数读取 parquet 后用lpep_dropoff_datetime - lpep_pickup_datetime计算 duration 并换算为分钟只保留时长在[1, 60]分钟之间的记录同时将PULocationID、DOLocationID转为字符串特征工程preprocess函数把上下车地点拼成组合特征PU_DO PULocationID _ DOLocationID与数值特征trip_distance一起构造成 dict 记录再通过DictVectorizer转为稀疏特征矩阵。注意fit_dv参数只对训练集调用fit_transform验证/测试集只做transform避免数据泄漏月份划分run_data_prep按文件名约定加载green_tripdata_2023-01/02/03.parquet分别作为 train / val / test落盘dump_pickle把 4 个对象保存到dest_path——dv.pkl向量器、train.pkl、val.pkl、test.pkl每个数据集是(X, y)元组。由此可以直接回答 Q2 的选择题“OUTPUT_FOLDER 保存了多少个文件”——从源码的 4 处dump_pickle调用看答案是4。3. Q3用 autolog 训练模型train.py 的改造方式Q3 要求用 Scikit-Learn 的RandomForestRegressor在预处理好的数据上训练并改造训练脚本启用 MLflow autologging运行后启动 MLflow UI 确认 run 被正确跟踪。作业版 train.py 目前是“裸”训练代码加载train.pkl/val.pkl用RandomForestRegressor(max_depth10, random_state0)训练在验证集上计算mean_squared_error(..., squaredFalse)得到 RMSE但没有任何 MLflow 调用。对照 solution/train.py官方答案的改造点只有四处import mlflow mlflow.set_tracking_uri(sqlite:///mlflow.db) mlflow.set_experiment(random-forest-train) # 在 run_train 内部 mlflow.sklearn.autolog() # 开启 sklearn 自动日志 with mlflow.start_run(): # 文档 Tip 1 强调用 start_run 包裹训练代码 rf RandomForestRegressor(max_depth10, random_state0) ...从源码结构看这正是 autologging 的标准用法mlflow.sklearn.autolog()会拦截RandomForestRegressor的构造与fit调用自动记录超参数如max_depth、random_state等再配合start_run()把日志归属到当前 run。不要修改模型超参数文档 Tip 2以保证训练快速完成且结果可比。Q3 的选择题问 run 中记录的min_samples_split是多少。由于脚本只显式指定了max_depth10与random_state0其余参数取 Scikit-Learn 默认值因此 UI 中看到的min_samples_split为2默认值。4. Q4本地启动 tracking server含模型注册表Q4 要求在本地启动一个 tracking server——这样不仅能跟踪实验还能访问model registry。具体任务在本地启动 tracking server使用SQLite作为 backend store使用名为artifacts的文件夹作为 artifacts store保持 server 持续运行因为后续两个练习Q5、Q6都要连接它。对应的标准启动命令与课程 模块 2 的 notebook 中的本地 server 用法一致为mlflow server --backend-store-uri sqlite:///mlflow.db --default-artifact-root ./artifacts --serve-artifacts参数含义--backend-store-uri sqlite:///mlflow.db元数据实验、run、参数、指标存到本地 SQLite 文件mlflow.db--default-artifact-root ./artifacts指定 artifacts模型文件等的默认存储目录--serve-artifacts让 server 自身负责 artifacts 的上传/下载代理客户端无需直连文件系统。Q4 的选择题问“除了backend-store-uri还需要传什么才能正确配置 server”。从上面命令与选项看核心答案是default-artifact-root配套示例中同时携带--serve-artifacts选项中artifacts-only、artifacts-destination并非该版本的配置项。5. Q5用 hyperopt 调超参并逐次记录hpo.py 的改造方式Q5 要求用hyperopt调优RandomForestRegressor改造 hpo.py确保每次调参迭代都把验证 RMSE 记录到 tracking server即在objective函数中加几行代码然后不带任何参数直接运行脚本最后在 UI 中查看实验random-forest-hyperopt的所有 run。注意文档明确本练习不要使用 autologging只手动记录回答问题所需的信息——传给objective的超参数列表以及验证集2023 年 2 月数据上的 RMSE。作业版脚本中objective只返回{loss: rmse, status: STATUS_OK}给 hyperopt没有任何 MLflow 日志。对照 solution/hpo.py改造点在objective内def objective(params): with mlflow.start_run(): # 每次迭代一个 run mlflow.log_params(params) # 记录本次采样的超参 rf RandomForestRegressor(**params) rf.fit(X_train, y_train) y_pred rf.predict(X_val) rmse mean_squared_error(y_val, y_pred, squaredFalse) mlflow.log_metric(rmse, rmse) # 记录验证集 RMSE return {loss: rmse, status: STATUS_OK}脚本其余部分保持不变其调参配置值得注意顶部mlflow.set_tracking_uri(http://127.0.0.1:5000)指向 Q4 启动的本地 server实验名为random-forest-hyperopt搜索空间scope.int(hp.quniform(...))为max_depth ∈ [1, 20]、n_estimators ∈ [10, 50]、min_samples_split ∈ [2, 10]、min_samples_leaf ∈ [1, 4]且random_state固定为 42fmin使用tpe.suggest算法max_evalsnum_trialsCLI 默认 15 次并用rstate np.random.default_rng(42)固定随机数保证搜索结果可复现。Q5 的选择题问“你得到的最优验证 RMSE 是多少”选项为 4.817 / 5.335 / 5.818 / 6.336。由于random_state与rstate均已固定15 次 TPE 采样的轨迹是确定的运行后在 UI 中按metrics.rmse排序即可从上述四个选项里选出最接近的值。6. Q6把最优模型推送到模型注册表register_model.pyQ6 要求把表现最好的模型提升到模型注册表。仓库提供的 register_model.py 已经实现了前半段逻辑通过MlflowClient().search_runs从实验random-forest-hyperopt中按order_by[metrics.rmse ASC]取出 top 5 的 run--top_n默认 5对每个 run用其超参数重新训练在新实验random-forest-best-models中记录val_rmse与test_rmse测试集为 2023 年 3 月数据顶部调用了mlflow.sklearn.autolog()因此模型工件modelartifact会被自动记录到每个 run 中为后续注册提供model_uri。作业留空的部分源码中注释掉的client.search_runs(...)与mlflow.register_model(...)对照 solution/register_model.py 的完整实现# 选出 test_rmse 最低的 run experiment client.get_experiment_by_name(EXPERIMENT_NAME) best_run client.search_runs( experiment_idsexperiment.experiment_id, run_view_typeViewType.ACTIVE_ONLY, max_resultstop_n, order_by[metrics.test_rmse ASC] )[0] # 注册最优模型 run_id best_run.info.run_id model_uri fruns:/{run_id}/model mlflow.register_model(model_uri, namerf-best-model)这里有两个文档 Tip 对应的关键点Tip 1用MlflowClient的search_runs配合order_by[metrics.test_rmse ASC]取排序第一的 runTip 2mlflow.register_model需要形如runs:/RUN_ID/model的model_uri字符串和一个模型名示例答案取名rf-best-model。Q6 的选择题问最优模型的测试 RMSE选项为 5.060 / 5.567 / 6.061 / 6.568——运行脚本后在 UI 的random-forest-best-models实验中查看注册模型的test_rmse即可作答。另外需要注意版本相关事实课程 模块 2 README 明确指出从 MLflow 2.9 起模型注册表的 stages 已被弃用应改用模型版本 tags 与 aliases例如用set_registered_model_alias替代transition_model_version_stage同时list_experiments已被search_experiments取代。如果你的 MLflow 版本较新后续操作注册表时应使用这些新 API。7. 关键文件与操作速查练习脚本核心操作仓库路径Q2preprocess_data.pypython preprocess_data.py --raw_data_path TAXI_DATA_FOLDER --dest_path ./output产出 4 个 pickle 文件homework/preprocess_data.pyQ3train.py加mlflow.sklearn.autolog()with mlflow.start_run():包裹训练homework/train.py、solution/train.pyQ4—mlflow server --backend-store-uri sqlite:///mlflow.db --default-artifact-root ./artifacts --serve-artifacts本地终端Q5hpo.pyobjective内加mlflow.log_params与mlflow.log_metric连接http://127.0.0.1:5000homework/hpo.py、solution/hpo.pyQ6register_model.pysearch_runs(order_by[metrics.test_rmse ASC])mlflow.register_model(runs:/RUN_ID/model, ...)homework/register_model.py、solution/register_model.py整份作业的提交入口与答题规则见 homework.md 的 “Submit the results” 一节答案与选项不完全一致时选择最接近的一项。整套练习串起来恰好演示了 MLOps 中实验跟踪到模型治理的最小完整闭环本地记录单模型训练 → 远程 server 记录调参过程 → 注册表沉淀可复用的最优模型也为后续模块编排、部署、监控提供了可部署的模型来源。【免费下载链接】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),仅供参考
返回列表