MLflow项目
MLflow项目是一种以可重用和可重复的方式打包数据科学代码的格式,主要基于约定。此外,Projects组件包括用于运行项目的API和命令行工具,可以将项目链接到工作流中。
目录
- 概观
- 指定项目
- 运行项目
- 快速迭代
- 构建多步骤工作流程
概观
MLflow Projects的核心只是组织和描述代码的惯例,让其他数据科学家(或自动化工具)运行它。每个项目都只是一个包含代码的文件目录或Git存储库。MLflow可以根据将文件放在此目录中的约定来运行某些项目(例如,conda.yaml
文件将被视为 Conda环境),但您可以通过添加MLproject
文件来更详细地描述您的项目,该文件是YAML格式的文本文件。每个项目都可以指定几个属性:
名称
依赖
运行项目所需的库。MLflow目前使用 Conda包管理器,它支持Python包和本机库(例如,CuDNN或Intel MKL),以指定依赖关系。MLFLOW_CONDA_HOME
如果指定,MLflow将使用环境变量给出的Conda安装(例如,通过调用运行Conda命令$MLFLOW_CONDA_HOME/bin/conda
),conda
否则默认运行。
入口点
可以在项目中执行的命令,以及有关其参数的信息。大多数项目至少包含一个您希望其他用户调用的入口点。某些项目还可以包含多个入口点:例如,您可能拥有一个包含多个特征化算法的Git存储库。您还可以将项目中的任何文件.py
或.sh
文件作为入口点调用。MLproject
但是,如果在文件中列出入口点,则还可以为它们指定参数,包括数据类型和默认值。
您可以使用 命令行工具或Python API 从Git URI或本地目录运行任何项目。这些API还允许在Databricks上提交项目以进行远程执行。mlflow run
mlflow.projects.run()
警告 默认情况下,MLflow将为Git项目使用一个新的临时工作目录。这意味着您通常应该使用绝对路径而不是相对路径将任何文件参数传递给MLflow项目。如果您的项目声明了其参数,MLflow将自动为类型参数创建绝对路径
path
。
指定项目
默认情况下,任何Git存储库或本地目录都被视为项目,MLflow使用以下约定来确定其参数:
- 项目的名称是目录的名称。
- 该conda中指定的
conda.yaml
,如果存在的话。如果没有conda.yaml
文件,MLflow将在运行项目时使用仅包含Python的Conda环境(特别是Conda可用的最新Python)。 - 项目中的任何
.py
和.sh
文件都可以是一个入口点,没有显式声明参数。当您使用一组参数执行此类命令时,MLflow将使用语法传递命令行上的每个参数。--key value
name: My Project
conda_env: my_env.yaml
entry_points:
main:
parameters:
data_file: path
regularization: {type: float, default: 0.1}
command: "python train.py -r {regularization} {data_file}"
validate:
parameters:
data_file: path
command: "python validate.py {data_file}"
如您所见,该文件可以指定名称和不同的环境文件,以及有关每个入口点的更多详细信息。具体来说,每个入口点都有一个运行命令和参数(包括数据类型)。接下来我们将描述这两个部分。
命令语法
在文件中指定入口点时MLproject
,该命令可以是Python 格式字符串语法中的任何字符串 。在入口点的parameters
字段中声明的所有参数都将传递到此字符串中以进行替换。如果使用字段中未列出的 其他参数调用项目parameters
,MLflow将使用语法传递它们,因此您可以使用该文件仅为参数的子集声明类型和默认值。--key value``MLproject
在替换命令中的参数之前,MLflow使用Python的shlex.quote函数转义它们 ,因此您无需担心在命令字段中添加引号。
指定参数
MLflow允许为每个参数指定数据类型和默认值。您可以通过编写以下内容来指定数据类型:
parameter_name: data_type
在您的YAML文件中,或者使用以下语法之一(在YAML中等效)添加默认值:
parameter_name: {type: data_type, default: value} # Short syntax
parameter_name: # Long syntax
type: data_type
default: value
MLflow支持四种参数类型,其中一些特殊处理(例如,将数据下载到本地文件)。任何未声明的参数都被视为string
。参数类型是:
string
float
path
本地文件系统上的路径。MLflow会将为此类参数传递的任何相对路径转换为绝对路径,并且还会将作为分布式存储URI(s3://
和dbfs://
)传递的任何路径下载到本地文件。将此类型用于只能读取本地文件的程序。
URI
本地或分布式存储系统中的数据URI。MLflow会将任何相对路径转换为绝对路径,如path
类型中所示。对于知道如何从分布式存储中读取的程序(例如使用Spark),请使用此类型。
运行项目
MLflow提供了两种简单的方法来运行项目:命令行工具或Python API。这两个工具都采用以下参数:mlflow run
mlflow.projects.run()
项目URI
可以是本地文件系统上的目录,也可以是Git存储库路径,指定为表单的URI https://<repo>
(使用HTTPS)或user@host:path
(通过SSH使用Git)。要针对位于项目子目录中的MLproject文件运行,请在URI参数的末尾添加“#”,然后是从项目根目录到包含所需项目的子目录的相对路径。
项目版本
对于基于Git的项目,要运行的Git存储库中的提交哈希或分支名称。
入口点
要使用的入口点的名称,默认为main
。您可以使用MLproject
文件中指定的任何入口点,或项目中的任何.py
或.sh
文件,作为项目根目录中的路径(例如,src/test.py
)。
参数
键值参数。如果需要,将验证并转换具有声明类型的任何参数 。
部署模式
如果您有Databricks帐户,命令行和API都允许您在Databricks环境中远程启动项目。这包括设置群集参数,例如VM类型。当然,您还可以使用本地版本的 命令在您选择的任何其他计算基础架构上运行项目(例如,提交对标准作业排队系统执行的脚本)。mlflow run
例如,本教程创建并发布一个训练线性模型的ML项目。该项目也在GitHub上发布,网址为https://github.com/mlflow/mlflow-example。要执行此项目,请运行:
mlflow run git@github.com:mlflow/mlflow-example.git -P alpha=0.5
还有其他选项可用于禁用Conda环境的创建,如果您希望在现有shell环境中快速测试项目,这将非常有用。
Databricks上的远程执行
在Databricks上远程运行项目的支持处于beta预览阶段,需要Databricks帐户。要接收有关该功能的未来更新,请在此处注册。
在Databricks上启动远程执行
要使用此功能,您需要拥有Databricks帐户(尚不支持Community Edition),并且您必须设置Databricks命令行实用程序。在Databricks文档中找到更详细的说明(此处为Azure Databricks,此处为AWS上的Databricks)。有关如何使用该功能的简要概述如下:
首先,创建一个包含 运行的集群规范的JSON文件 。然后,通过运行您的项目
mlflow run <uri> -m databricks --cluster-spec <json-cluster-spec>
必须是Git存储库URI。您还可以通过git-username和git-password参数(或通过MLFLOW_GIT_USERNAME和 MLFLOW_GIT_PASSWORD环境变量)传递Git凭据 。
快速迭代
如果要快速开发项目,我们建议创建一个MLproject
文件,将主程序指定为main
入口点,并运行它。为避免重复写入,您可以在文件中添加默认参数。mlflow run .
构建多步骤工作流程
mlflow.projects.run()
API,结合mlflow.tracking
,使得可以构建具有不同的项目(或入口点在同一个项目)作为单独的步骤的多步骤的工作流程。每次调用都会mlflow.projects.run()
返回一个运行对象,您可以使用它 mlflow.tracking
来确定运行何时结束并获取其输出工件。然后,这些伪像可以被传递到另一个步骤,该步骤需要path
或uri
参数。您可以在单个Python程序中协调所有工作流,该程序查看每个步骤的结果,并使用自定义代码决定接下来要提交的内容。一些示例用于多步骤工作流的案例包括:
模块化您的数据科学代码
不同的用户可以发布可重用的步骤,用于数据特征化,培训,验证等,其他用户或团队可以在他们的工作流程中运行。由于MLflow支持Git版本控制,因此另一个团队可以将其工作流程锁定到项目的特定版本,或者按照自己的计划升级到新版本。
超参数调整
使用mlflow.projects.run()
您可以在本地计算机上或在像Databricks这样的云平台上并行启动多个运行。然后,您的驱动程序可以实时检查每次运行的指标,以取消运行,启动新运行或选择目标指标上运行最佳的运行。
交叉验证
有时您希望在培训和验证数据的不同随机分组上运行相同的培训代码。使用MLflow项目,您可以以允许此方式打包项目,例如,通过将列车/验证拆分的随机种子作为参数,或者首先调用可以拆分输入数据的另一个项目。
有关如何构建此类多步骤工作流的示例,请参阅MLflow Multistep 工作流示例项目。