ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

在 R 中使用 MLflow:从实验追踪到模型部署的完整实践指南

在 R 中使用 MLflow:从实验追踪到模型部署的完整实践指南 在 R 中使用 MLflow从实验追踪到模型部署的完整实践指南【免费下载链接】mlflowThe open source AI engineering platform for agents, LLMs, and ML models. MLflow enables teams of all sizes to debug, evaluate, monitor, and optimize production-quality AI applications while controlling costs and managing access to models and data.项目地址: https://gitcode.com/GitHub_Trending/ml/mlflowMLflow 为 R 语言提供了一等公民的官方接口mlflowR 包让 R 开发者能够在本地或远程追踪机器学习实验、以可复现的 MLflow Project 格式打包 R 代码并以标准 MLflow Model 格式保存与部署 R 模型。本文以仓库中的 R 接口官方文档 为主线结合 R 包源码 与 r_wine 示例完整讲解从环境准备、安装、实验追踪、参数化脚本、模型保存到本地服务的端到端工作流。读完本文你将掌握在 R 中调用mlflow_set_experiment()、mlflow_log_metric()、mlflow_save_model()、mlflow_rfunc_serve()等核心 API并理解它们底层如何与 MLflow Python 包和 REST 服务协同工作。环境准备R 客户端与 Python 运行时的关系MLflow 的 R 客户端本质上是一个桥接层R 包负责提供符合 R 语言习惯的 API而实际的实验追踪、模型格式与 CLI 能力由 MLflow Python 包提供。因此使用 R API 前必须先安装 MLflow Python 包pip install mlflow默认情况下R 客户端通过Sys.which(python)和Sys.which(mlflow)自动定位 Python 与 MLflow CLI。从 python.R 源码 可以看到完整的探测顺序优先读取MLFLOW_PYTHON_BIN环境变量其次读取 Databricks Notebook 环境中定义的MLFLOW_PYTHON_EXECUTABLE此时会用它执行python -c import sys; print(sys.executable)解析出真实解释器路径最后才回退到Sys.which(python)若三者都不可用会抛出明确错误提示先执行pip install mlflow。当 Python 与 MLflow 二进制位于非标准位置例如 conda 环境或虚拟环境时可以显式指定export MLFLOW_PYTHON_BIN/path/to/bin/python export MLFLOW_BIN/path/to/bin/mlflow设置后MLFLOW_PYTHON_BIN会被python_bin()缓存到包全局变量MLFLOW_BIN则直接决定后续mlflow_cli()调用所执行的命令路径参见 python.R。安装 R 包从 GitHub 安装mlflowR 包需要指定子目录devtools::install_github(mlflow/mlflow, subdir mlflow/R/mlflow)仓库中 R 包源码位于 mlflow/R/mlflow其中R/目录下按功能拆分为若干源文件实验追踪tracking-experiments.R、tracking-runs.R、模型相关model.R、model-crate.R、model-serve.R、项目运行project-run.R、project-source.R、project-param.R等并附带完整的 roxygen 文档man/*.Rd与 testthat 测试tests/testthat/可作为阅读与二次开发的最佳入口。开发模式安装若要与最新开发版运行时协同工作需要同时具备开发版 R 包与开发版 Python 运行时按上述方式安装开发版 R 包下载或克隆 MLflow 仓库并将其安装为开发版 Python 运行时git clone https://github.com/mlflow/mlflow # 升级到最新开发版本 pip install -e local github repo实验追踪Tracking记录参数、指标与可视化MLflow Tracking 允许你在运行 R 代码时记录参数、代码版本、指标与输出文件之后在 UI 中统一可视化。MLflow 通过experiment实验对运行run进行分组便于针对同一任务的不同尝试进行比较。创建并激活一个新实验library(mlflow) mlflow_set_experiment(Test)从 tracking-experiments.R 源码 可以看到mlflow_set_experiment()的完整语义若传入的实验名已存在则通过mlflow_get_experiment()获取其 ID 并激活若不存在则打印提示并调用mlflow_create_experiment()创建新实验最后写入全局 active experiment ID。注意experiment_name与experiment_id只能二选一同时传入或都不传都会直接报错。之后通过mlflow_ui()在浏览器中打开 MLflow UI 查看实验mlflow_ui()连接远程 Tracking Server默认实验存储在本地若要与他人共享实验可先运行一个 MLflow tracking servermlflow server然后在 R 中指定其地址mlflow_set_tracking_uri(http://tracking-server:5000)一旦设置了 tracking URI实验与运行数据都会被写入指定服务器其他协作者也能通过该 URI 访问。在仓库中mlflow_set_tracking_uri()对应 tracking-globals.R 内的全局状态管理后续所有 REST 请求都会路由到该地址。MLflow Projects打包可复现的 R 代码MLflow Project 是一种将数据科学代码打包为可复用、可复现运行单元的格式。除了显式创建MLproject文件外也可以隐式使用在终端用mlflowCLI 直接运行 R 脚本。以仓库自带的 r_wine 示例 为例mlflow run examples/r_wine --entry-point train.R该命令等价于在examples/r_wine目录下执行Rscript -e mlflow::mlflow_source(train.R)train.R内部完成训练与日志记录的核心逻辑如下完整脚本见 examples/r_wine/train.Rlibrary(mlflow) library(glmnet) library(carrier) set.seed(40) # 读取 wine-quality 数据集并划分训练/测试集0.75 / 0.25 data - read.csv(wine-quality.csv) sampled - sample(1:nrow(data), 0.75 * nrow(data)) train - data[sampled, ] test - data[-sampled, ] # 通过 mlflow_param 定义可调参数 alpha - mlflow_param(alpha, 0.5, numeric) lambda - mlflow_param(lambda, 0.5, numeric) with(mlflow_start_run(), { model - glmnet(train_x, train_y, alpha alpha, lambda lambda, family gaussian, standardize FALSE) predictor - crate(~ glmnet::predict.glmnet(model, as.matrix(.x)), model model) predicted - predictor(test_x) rmse - sqrt(mean((predicted - test_y) ^ 2)) r2 - as.numeric(cor(predicted, test_y) ^ 2) mlflow_log_param(alpha, alpha) mlflow_log_param(lambda, lambda) mlflow_log_metric(rmse, rmse) mlflow_log_metric(r2, r2) mlflow_log_model(predictor, model) })注意with(mlflow_start_run(), {...})的惯用法进入 run 作用域后所有mlflow_log_*调用都归属该 run作用域结束时自动结束 run。README 中的最小示例同样演示了这种模式library(mlflow) # 记录参数 column - mlflow_log_param(column, 1) # 记录总行数 mlflow_log_metric(rows, nrow(iris)) # 训练模型 model - lm( Sepal.Width ~ x, data.frame(Sepal.Width iris$Sepal.Width, x iris[, column]) ) # 记录模型截距 mlflow_log_metric(intercept, model$coefficients[[(Intercept)]])参数化脚本mlflow_param 与 -P 传参实验通常需要参数化脚本以支撑多次对比运行。可以通过mlflow_param()定义带类型的参数示例见 tests/testthat/examples/params_example.Rlibrary(mlflow) # 定义参数 my_int - mlflow_param(my_int, 1, integer) my_num - mlflow_param(my_num, 1.0, numeric) # 记录参数 mlflow_log_param(param_int, my_int) mlflow_log_param(param_num, my_num)然后通过mlflow run配合-P传入自定义参数mlflow run tests/testthat/examples/ --entry-point params_example.R -P my_int10 -P my_num20.0 -P my_strXYZ运行过程会打印如下信息run ID 每次不同 Created directory /var/folders/.../tmpi6d2_wzf for downloading remote URIs passed to arguments of type path Running command source /miniconda2/bin/activate mlflow-... Rscript -e mlflow::mlflow_source(params_example.R) --args --my_int 10 --my_num 20.0 --my_str XYZ in run with ID 191b489b2355450a8c3cc9bf96cb1aa3 Run (ID 191b489b2355450a8c3cc9bf96cb1aa3) succeeded 底层机制见 project-param.Rmlflow_param(name, default, type)中type必须是numeric、integer、string三者之一未指定时从default的typeof()推断参数值最终从.globals$run_params全局环境中读取而parse_command_line()同文件 L68-L106负责解析--args之后的--key value或--keyvalue形式命令行参数支持类型化 YAML 解析并将-转换为_。整个解析与注入流程在mlflow_source()中完成见 project-source.R。运行结果同样可通过mlflow_ui()查看。Models标准格式保存 R 模型MLflow Model 是打包机器学习模型的标准格式可用于各类下游工具——例如通过 REST API 实时服务或在 Apache Spark 上做批量推理。其核心约定是一个模型可包含多种flavor风味供不同的下游工具理解。保存模型mlflow_save_model使用mlflow_save_model()保存模型。例如为前面的train.R追加以下代码# train model (...) # save model mlflow_save_model( crate(~ stats::predict(model, .x), model) )随后触发一次同时保存模型的 runmlflow run train.R这里用到的crate()来自 carrier 中mlflow_save_model.crate()实现将模型通过serialize()后写入crate.bin并在MLmodel文件中登记crateflavormlflow_load_flavor.mlflow_flavor_crate()则通过unserialize(readRDS(...))还原mlflow_predict.crate()以do.call(model, list(data, ...))完成预测分发。模型目录结构每个 MLflow Model 本质是一个目录包含任意文件并在目录根部的MLmodel文件中声明多个 flavor。查看保存的模型目录dir(model)## [1] crate.bin MLmodel查看模型定义文件cat(paste(readLines(model/MLmodel), collapse \n))## flavors: ## crate: ## version: 0.1.0 ## model: crate.bin ## time_created: 18-10-03T22:18:25.25.55 ## run_id: 4286a3d27974487b95b19e01b7b3caab可以看到MLmodel记录了 flavor 名称、版本、模型文件、创建时间与所属 run_id。从 model.R 源码 可知加载模型时mlflow_load_model()会读取MLmodel将模型声明的 flavors 与 R 包支持列表求交集若没有交集直接报错存在多个可用 flavor 时默认加载第一个并给出 warning也支持通过flavor参数显式指定。R 端已实现 crate、h2o、keras、xgboost 等 flavor见 model-h2o.R、model-keras.R、model-xgboost.R。用保存的模型做预测保存后的 R 模型可通过mlflow_rfunc_predict()进行预测mlflow_rfunc_predict(model, data data.frame(x c(0.3, 0.2)))## Warning in mlflow_snapshot_warning(): Running without restoring the ## packages snapshot may not reload the model correctly. Consider running ## mlflow_restore_snapshot() or setting the restore parameter to TRUE. ## ## 1 2 ## 3.400381 3.406570输出中的 warning 提示未恢复包快照时可能无法正确加载模型建议执行mlflow_restore_snapshot()或将restore参数设为TRUE详见下文 Dependencies 一节。mlflow_rfunc_predict()的实现见 model.R它加载模型后根据content_type默认json支持csv解析输入调用mlflow_predict()最终用jsonlite::write_json()输出结果。Deployment本地服务与在线预测MLflow 提供了本地机器及多种生产环境的部署工具。R 模型RFunc flavor可以一键起一个本地 REST API 服务mlflow rfunc serve model等价于Rscript -e mlflow_rfunc_serve(model)服务内部由 model-serve.R 驱动mlflow_rfunc_serve(model_uri, host 127.0.0.1, port 8090, daemonized FALSE, browse !daemonized, ...)基于httpuv启动服务器。服务端点遵循标准 MLflow models 接口核心路由见serve_handlers()包括/ping健康检查模型加载成功返回 200/invocation标准 MLflow 推理端点支持application/json含dataframe_split/dataframe_records两种格式与text/csv/predictRFunc 模型兼容的历史端点文档明确标注未来版本会移除/Swagger UI 交互式文档页面可通过options(mlflow.swagger FALSE)关闭。daemonized TRUE时服务器转为后台守护进程不阻塞交互式 R 会话需通过返回的 handle 调用httpuv::stopDaemonizedServer()终止。此外还可直接对数据文件做离线预测mlflow rfunc predict model data.json等价于Rscript -e mlflow_rfunc_predict(model, data.json)mlflow_rfunc_predict()支持从 stdin 读取input_path缺省时并写往 stdout便于嵌入 Shell 管道。Dependencies依赖快照与恢复运行项目时mlflow_snapshot()会被自动调用生成r-dependencies.txt文件其中包含所需 R 包及其版本列表。但依赖恢复默认不自动执行因为它通常代价较高。需要时手动执行mlflow_restore_snapshot()可通过设置MLFLOW_SNAPSHOT_CACHE环境变量指向缓存目录显著加快依赖恢复速度export MLFLOW_SNAPSHOT_CACHE/path/to/cacheRStudio 集成源码触发自动追踪为了在 RStudio 中实现快速迭代的同时持续追踪模型改进RStudio 1.2.897 及以上版本支持在脚本被 source 时自动触发mlflow_run()。启用方式是在 R 脚本顶部加入一行特殊注释# !source mlflow::mlflow_run该机制让 R 开发者无需离开 IDE 即可在每次源码执行时自动创建 run、记录日志并对比实验结果。小结与进一步阅读本文围绕 MLflow R 接口走通了完整的实践链路环境准备与安装 → 实验追踪本地/远程→ 参数化 Project 运行 → 模型保存flavor 机制→ 本地服务与预测 → 依赖管理 → RStudio 集成。所有核心 API 都能在 mlflow/R/mlflow/R 找到对应实现测试用例见 mlflow/R/mlflow/tests/testthat覆盖参数解析、实验/运行追踪、模型保存与 serve 等可直接参考或扩展。想进一步深入可以阅读完整的 R API 参考文档mlflow/R/mlflow/man 下的.Rd文件参照 examples/r_wine/train.R 与 params_example.R 编写自己的可复现实验脚本结合 examples/docker 与 examples/mlflow_artifacts 探索容器化与工件服务场景。【免费下载链接】mlflowThe open source AI engineering platform for agents, LLMs, and ML models. MLflow enables teams of all sizes to debug, evaluate, monitor, and optimize production-quality AI applications while controlling costs and managing access to models and data.项目地址: https://gitcode.com/GitHub_Trending/ml/mlflow创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表