近年来,人工智能与数据科学领域发展迅速,传统项目在演化中也愈来愈复杂了,如何管理大量的机器学习项目成为一个难题。html
在真正的机器学习项目中,咱们须要在模型以外花费大量的时间。好比:python
机器学习算法有可配置的超参一般都是十几个到几十个不等,如何跟踪这些参数、代码以及数据在每一个实验中的表现目前业界也没有一个统一的解决方案,更多都是根据某个实验进行单独的开发。git
部署ML模型一般都须要将模型文件和线上环境Service/Spark Job/SDK(Java/Scala/C++)对接,而大部分数据科学家一般都不太熟悉这些工程开发语言。所以,将模型迁移到不一样平台是具备挑战性的,它意味着数据科学家还须要考虑线上部署的性能问题,目前业界也缺乏比较通用的模型部署工具。github
目前,在大厂内部已经孵化出这样的一些机器学习平台,好比 Uber 的 Michelangelo、Google 的 TFX,可是他们都与大厂的基础架构深度耦合,因此也没有在开源社区流行起来。算法
在这样的背景下, mlflow 框架横空出世,它的出现旨在将效果追踪、模型调参、模型训练、模型代码、模型发布等模块集中一处,提高数据科学工做流的管理效率。数据库
mlflow 将数据科学工做流分为3个部分:json
mlflow tracking 提供了一个入口,用于将机器学习的参数、代码版本、代码路径、评估指标等统一管理,输出到系统中可视化管理。一般咱们模型会迭代不少次,这样每次输出的结果就能够集中对比效果的好坏。segmentfault
好比:api
library(mlflow) # 记录超参 my_int <- mlflow_param("my_int", 1, "integer") my_num <- mlflow_param("my_num", 1.0, "numeric") # 记录指标 mlflow_log_metric("accuracy", 0.45) # 记录输出文件(模型、feature importance图)等 mlflow_log_atrifact("roc.png") mlflow_log_artifact("model.pkl")
mlflow project 提供了打包可重用数据科学代码的标准格式,项目经过本地文件/git管理代码,经过 yaml 文件来描述。浏览器
name: FinanceR Project conda_env: conda.yaml entry_points: main: parameters: data_file: path regularization: {type: double, default: 0.1} command: "python train.py -r {regularization} {data_file}" validate: parameters: data_file: path command: "python validate.py {data_file}"
codna
将提供统一的虚拟环境服务,经过 mlflow run
能够任意执行项目的 pipeline
mlflow run example/project -P num_dimensions=5 mlflow run git@github.com:xxx/xxx.git -P num_dimensions=5
下面举一个官网的具体例子:
devtools::install_github("mlflow/mlflow", subdir = "mlflow/R/mlflow") mlflow::mlflow_install()
# Sample R code showing logging model parameters library(mlflow) # Define parameters my_int <- mlflow_param("my_int", 1, "integer") my_num <- mlflow_param("my_num", 1.0, "numeric") my_str <- mlflow_param("my_str", "a", "string") # Log parameters mlflow_log_param("param_int", my_int) mlflow_log_param("param_num", my_num) mlflow_log_param("param_str", my_str)
# Sample R code training a linear model library(mlflow) # Read parameters column <- mlflow_log_param("column", 1) # Log total rows mlflow_log_metric("rows", nrow(iris)) # Train model model <- lm(Sepal.Width ~ iris[[column]], iris) # Log models intercept mlflow_log_metric("intercept", model$coefficients[["(Intercept)"]])
library(mlflow) # Create and activate the “R-Test” experiment mlflow_create_experiment("R-Test") mlflow_active_run()
mlflow_ui()
默认须要在浏览器中访问 localhost:5000
超参调优支持3种模式:
mlflow run -e random --experiment-id <hyperparam_experiment_id> -P \ training_experiment_id=<individual_runs_experiment_id> examples/r_wine --entry-point train.R
其中 train.R 为
library(mlflow) # read parameters column <- mlflow_log_param("column", 1) # log total rows mlflow_log_metric("rows", nrow(iris)) # train model model <- lm( Sepal.Width ~ x, data.frame(Sepal.Width = iris$Sepal.Width, x = iris[,column]) ) # log models intercept mlflow_log_metric("intercept", model$coefficients[["(Intercept)"]]) # save model mlflow_save_model( crate(~ stats::predict(model, .x), model) )
mlflow rfunc serve model
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'. ## 3.400381396714573.40656987651099 ## 1 2 ## 3.400381 3.406570
或者在命令行中调用
mlflow rfunc predict model data.json
mlflow 的出现极大方便了炼丹师傅们的工做,提供了堪比 michelangelo 的用户体验,而且全面支持 sklearn、spark、pytorch、tensorflow、mxnet、mlr、xgboost、keras 等主流算法框架。更多 mlflow 的详细资料能够参见官方文档。
做为分享主义者(sharism),本人全部互联网发布的图文均听从CC版权,转载请保留做者信息并注明做者 Harry Zhu 的 FinanceR专栏: https://segmentfault.com/blog...,若是涉及源代码请注明GitHub地址: https://github.com/harryprince。微信号: harryzhustudio 商业使用请联系做者。