mlflow project

MLflow项目是一种用于数据科学代码的可重用和可重复的打包格式,基于约定和包括API及命令行工具。本文深入介绍了MLflow项目的概念,包括如何指定项目、运行项目、构建多步骤工作流程以及在不同环境下执行项目。

MLflow项目

MLflow项目是一种以可重用和可重复的方式打包数据科学代码的格式,主要基于约定。此外,Projects组件包括用于运行项目的API和命令行工具,可以将项目链接到工作流中。

概观

MLflow Projects的核心只是组织和描述代码的惯例,让其他数据科学家(或自动化工具)运行它。每个项目都只是一个包含代码的文件目录或Git存储库。MLflow可以根据将文件放在此目录中的约定运行一些项目(例如,conda.yaml文件被视为 Conda环境),但您可以通过添加MLproject文件来更详细地描述您的项目,该文件是YAML格式的文本文件。每个项目都可以指定几个属性:

名称

项目的可读名称。

入口点

可以在项目中运行的命令,以及有关其参数的信息。大多数项目至少包含一个您希望其他用户调用的入口点。某些项目还可以包含多个入口点:例如,您可能拥有一个包含多个特征化算法的Git存储库。您还可以将项目中的任何文件.py.sh文件作为入口点调用。MLproject但是,如果在文件中列出入口点,则还可以为它们指定参数,包括数据类型和默认值。

环境

应该用于执行项目入口点的软件环境。这包括项目代码所需的所有库依赖项。有关MLflow Projects支持的软件环境的更多信息,请参阅项目环境,包括 Conda环境和 Docker容器

您可以使用 命令行工具或Python API 从Git URI或本地目录运行任何项目。这些API还允许在Databricks和 Kubernetes上提交项目以进行远程执行。mlflow runmlflow.projects.run()

重要

默认情况下,MLflow为Git项目使用一个新的临时工作目录。这意味着您通常应该使用绝对路径而不是相对路径将任何文件参数传递给MLflow项目。如果您的项目声明其参数,MLflow会自动为类型参数创建绝对路径path

指定项目

默认情况下,任何Git存储库或本地目录都可以视为MLflow项目; 您可以调用目录中包含的任何bash或Python脚本作为项目入口点。该 项目目录节介绍MLflow如何解释目录的项目。

要提供对项目属性的附加控制,还可以在项目的存储库或目录中包含MLproject文件

最后,MLflow项目允许您指定 用于执行项目入口点的软件环境

项目环境

MLflow目前支持以下项目环境:Conda环境,Docker容器环境和系统环境。

康达环境

Conda环境支持Python包和本机库(例如,CuDNN或Intel MKL)。当MLflow项目指定Conda环境时,它会在项目代码运行之前激活。

默认情况下,MLflow使用系统路径来查找和运行conda二进制文件。您可以通过设置MLFLOW_CONDA_HOME环境变量来使用不同的Conda安装; 在这种情况下,MLflow尝试运行二进制文件$MLFLOW_CONDA_HOME/bin/conda

您可以通过conda.yaml 在项目目录的根目录中包含文件或conda_envMLproject文件中包含条目来 为MLflow项目指定Conda环境。有关详细信息,请参阅“ 项目目录”和“ 指定环境”部分。

Docker容器环境

Docker容器允许您捕获非Python依赖项,例如Java库。

当您运行指定Docker镜像的MLflow项目时,MLflow会添加一个新的Docker层,将项目的内容复制到/mlflow/projects/code目录中。此步骤将生成新图像。然后,MLflow运行新映像并在结果容器中调用项目入口点。

环境变量(例如)MLFLOW_TRACKING_URI在项目执行期间在Docker容器内传播。此外,项目创建的运行和 实验将保存到跟踪URI指定的跟踪服务器。当针对本地跟踪URI运行时,MLflow mlruns在容器内安装主机系统的跟踪目录(例如,本地目录),以便之后可以访问在项目执行期间记录的度量,参数和工件。

有关具有Docker环境的MLflow项目的示例,请参阅使用MLflow的Dockerized Model Training

要指定Docker容器环境,必须MLproject文件添加 到项目中。有关在MLproject文件中指定Docker容器环境的信息,请参阅 指定环境

系统环境

您还可以直接在当前系统环境中运行MLflow Projects。在项目执行之前,必须在系统上安装所有项目的依赖项。系统环境在运行时提供。它不是MLflow Project目录内容或MLproject文件的一部分。有关在运行项目时使用系统环境的信息,请参阅“ Environment正在运行的项目”部分中的参数说明。

项目目录

运行包含MLproject 文件的MLflow项目目录或存储库时,MLflow使用以下约定来确定项目的属性:

  • 项目的名称是目录的名称。
  • 康达环境 中指定的conda.yaml,如果存在的话。如果没有conda.yaml文件,MLflow在运行项目时使用仅包含Python的Conda环境(特别是Conda可用的最新Python)。
  • 项目中的任何.py.sh文件都可以作为入口点。MLflow使用Python来执行带.py扩展名的入口点,它使用bash来执行.sh扩展名的入口点。有关在运行时指定项目入口点的更多信息,请参阅运行项目
  • 默认情况下,当MLproject未包含文件时,入口点没有任何参数。可以在运行时通过CLI或 Python API 提供参数。运行时参数使用语法传递到命令行上的入口点。有关运行项目和运行时参数的更多信息,请参阅运行项目mlflow runmlflow.projects.run()--key value

MLproject文件

通过将MLproject文件(YAML语法中的文本文件)添加到项目的根目录,可以更好地控制MLflow项目。以下是MLproject文件的示例 :

name: My Project

conda_env: my_env.yaml
# Can have a docker_env instead of a conda_env, e.g.
# docker_env:
# image: mlflow-docker-example

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}"

该文件可以指定名称和Conda或Docker环境,以及有关每个入口点的更多详细信息。具体来说,每个入口点定义要运行命令和 传递给命令的参数(包括数据类型)。

指定环境

本节介绍如何在MLproject文件中指定Conda和Docker容器环境。 MLproject文件不能指定两个一康达环境和码头工人的环境。

康达环境

conda_envMLproject文件中包含顶级条目。此条目的值必须是 MLflow项目目录中Conda环境YAML文件相对路径。在以下示例中:

conda_env: files/config/conda_environment.yaml

conda_env是指位于一个环境文件 <MLFLOW_PROJECT_DIRECTORY>/files/config/conda_environment.yaml,其中<MLFLOW_PROJECT_DIRECTORY>是路径MLflow项目的根目录。

Docker容器环境

docker_envMLproject文件中包含顶级条目。此条目的值必须是在执行项目的系统上可访问的Docker镜像的名称; 此映像名称可能包含注册表路径和标记。这里有几个例子。

示例1:没有注册表路径的图像

docker_env:
  image: mlflow-docker-example-environment

在此示例中,docker_env引用具有名称mlflow-docker-example-environment和默认标记的Docker镜像 latest。由于未指定注册表路径,因此Docker会在运行MLflow项目的系统上搜索此图像。如果找不到图像,Docker会尝试从DockerHub中取出它。

示例2:远程注册表中的图像

docker_env:
  image: 012345678910.dkr.ecr.us-west-2.amazonaws.com/mlflow-docker-example-environment:7.0

在此示例中,docker_env引用具有路径的Docker注册表中具有名称mlflow-docker-example-environment和标记的Docker镜像 ,该7.0路径 012345678910.dkr.ecr.us-west-2.amazonaws.com对应于 Amazon ECR注册表。运行MLflow项目时,Docker会尝试从指定的注册表中提取图像。执行MLflow项目的系统必须具有从指定的注册表中提取此映像的凭据。

命令语法

在文件中指定入口点时MLproject,该命令可以是Python 格式字符串语法中的任何字符串 。在入口点的parameters字段中声明的所有参数都将传递到此字符串中以进行替换。如果使用字段中列出的 其他参数调用项目parameters,MLflow将使用语法传递它们,因此您可以使用该 文件仅为参数的子集声明类型和默认值。--key valueMLproject

在替换命令中的参数之前,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。参数类型是:

文本字符串。

浮动

一个真实的数字。MLflow验证参数是否为数字。

路径

本地文件系统上的路径。MLflow将任何相关path参数转换为绝对路径。MLflow还会将作为分布式存储URI(s3://dbfs://)传递的任何路径下载到本地文件。将此类型用于只能读取本地文件的程序。

小号

本地或分布式存储系统中的数据URI。MLflow将相对路径转换为绝对路径,如path类型中所示。对于知道如何从分布式存储读取的程序(例如,使用Spark的程序),请使用此类型。

运行项目

MLflow提供了两种运行项目的方法:命令行工具或Python API。这两个工具都采用以下参数:mlflow runmlflow.projects.run()

项目URI

本地文件系统上的目录或Git存储库路径,指定为表单的URI https://<repo>(使用HTTPS)或user@host:path (通过SSH使用Git)。要针对位于项目子目录中的MLproject文件运行,请在URI参数的末尾添加“#”,然后是从项目根目录到包含所需项目的子目录的相对路径。

项目版本

对于基于Git的项目,Git存储库中的提交哈希或分支名称。

入口点

入口点的名称,默认为main。您可以使用MLproject文件中指定的任何入口点,或项目中的任何.py.sh文件,作为项目根目录中的路径(例如,src/test.py)。

参数

键值参数。如果需要,将验证并转换具有声明类型的任何参数 。

部署模式

  • 命令行和API都允许您 在Databricks环境中远程启动项目。这包括设置群集参数,例如VM类型。当然,您也可以使用本地版本的命令在您选择的任何其他计算基础架构上运行项目(例如,提交对标准作业排队系统执行的脚本)。mlflow runmlflow run
  • 您还可以使用CLI 在Kubernetes集群上远程启动项目(请参阅在Kubernetes上运行MLflow项目(实验性))。mlflow run

环境

默认情况下,MLflow项目在项目目录或MLproject文件指定的环境中运行(请参阅指定项目环境)。您可以忽略项目的指定环境,并通过提供--no-conda标志在当前系统环境中运行项目。

例如,本教程创建并发布了一个训练线性模型的MLflow项目。该项目也在GitHub上发布,网址https://github.com/mlflow/mlflow-example。要运行此项目:

mlflow run git@github.com:mlflow/mlflow-example.git -P alpha=0.5

还有其他选项可用于禁用Conda环境的创建,如果您希望在现有shell环境中快速测试项目,这将非常有用。

在Databricks上运行MLflow项目

您可以在Databricks上远程运行MLflow Projects。要使用此功能,您必须拥有企业Databricks帐户(不支持Community Edition),并且您必须设置 Databricks CLI。在Databricks文档(Azure Databricks, AWS上的Databricks)中查找更详细的说明。有关如何使用该功能的简要概述如下:

重要

目前支持使用Docker环境执行MLflow项目的Databricks执行。

创建一个包含 运行的集群规范的JSON文件 。然后,使用该命令运行您的项目

mlflow run <project_uri> -b databricks --backend-config <json-cluster-spec>

其中<project_uri>是Git存储库URI或文件夹。

在Kubernetes上运行MLflow项目(实验性)

重要

作为实验性功能,API可能会发生变化。

您可以在Kubernetes上运行带有Docker环境的 MLflow项目 。以下部分提供了该功能的概述,包括带有示例的简单项目执行指南。

要查看此功能,您还可以参考 Docker示例,其中包括所需的Kubernetes后端配置(kubernetes_backend.json)和Kubernetes Job Spec (kubernetes_job_template.yaml)文件。

这个怎么运作

当您在Kubernetes上运行MLflow项目时,MLflow会构造一个包含Project内容的新Docker镜像; 此图像继承自Project的 Docker环境。然后,MLflow将新的Project映像推送到指定的Docker注册表,并 在指定的Kubernetes集群上启动 Kubernetes Job。此Kubernetes作业下载项目图像并启动相应的Docker容器。最后,容器调用Project的 入口点,将参数,标记,指标和工件记录到 MLflow跟踪服务器

执行指南

您可以按照以下步骤在Kubernetes上运行MLflow项目:

  1. 将Docker环境添加到MLflow项目(如果尚不存在)。有关参考,请参阅指定环境
  2. 使用以下条目创建后端配置JSON文件:
    • kube-context MLflow将运行工作 的Kubernetes环境
    • repository-uri Docker存储库的URI,用于上载(推送)项目执行Docker镜像。您的Kubernetes集群必须能够访问此存储库才能运行MLflow项目。
    • kube-job-template-path Kubernetes Job的YAML配置文件的路径 - 一个Kubernetes工作规范。MLflow读取作业规范并替换某些字段以便于作业执行和监视; MLflow不会修改原始模板文件。有关编写用于MLflow的Kubernetes Job Spec模板的更多信息,请参阅“ 作业模板”部分。

示例Kubernetes后端配置

{
  "kube-context": "docker-for-desktop",
  "repository-uri": "username/mlflow-kubernetes-example",
  "kube-job-template-path": "/Users/username/path/to/kubernetes_job_template.yaml"
}
  1. 如有必要,获取凭据以访问Project的Docker和Kubernetes资源,包括:

    MLflow预计,这些资源是通过访问 泊坞窗和 kubectl运行项目之前的CLI。

  2. 使用MLflow Projects CLI运行项目,或指定项目URI和后端配置文件的路径。例如:Python API

    mlflow run <project_uri> --backend kubernetes --backend-config examples/docker/kubernetes_config.json
    

    其中<project_uri>是Git存储库URI或文件夹。

工作模板

MLflow通过创建Kubernetes Job资源在Kubernetes上执行Projects 。MLflow通过读取用户指定的作业规范为MLflow项目创建Kubernetes作业 。当MLflow读取作业规范时,它会格式化以下字段:

  • metadata.name 替换为包含MLflow项目名称和项目执行时间的字符串
  • spec.template.spec.container[0].name 替换为MLflow项目的名称
  • spec.template.spec.container[0].image替换为在Project执行期间创建的Docker镜像的URI。此URI包含Docker镜像的摘要哈希。
  • spec.template.spec.container[0].command 替换为执行MLflow项目时指定的Project入口点命令。

以下示例显示了与MLflow Project执行兼容的简单Kubernetes Job Spec。使用括号内的文本表示替换的字段。

示例Kubernetes工作规范

apiVersion: batch/v1
kind: Job
metadata:
  name: "{replaced with MLflow Project name}"
  namespace: mlflow
spec:
  ttlSecondsAfterFinished: 100
  backoffLimit: 0
  template:
    spec:
      containers:
      - name: "{replaced with MLflow Project name}"
        image: "{replaced with URI of Docker image created during Project execution}"
        command: ["{replaced with MLflow Project entry point command}"]
      resources:
        limits:
          memory: 512Mi
        requests:
          memory: 256Mi
      restartPolicy: Never

container.namecontainer.imagecontainer.command字段只替换为第一的工作规格定义的容器。无需修改即可应用所有后续容器定义。

快速迭代

如果要快速开发项目,我们建议创建一个MLproject文件,将主程序指定为main入口点,并运行它。为避免重复写入参数,可以在文件中添加默认参数。mlflow run .MLproject

构建多步骤工作流程

mlflow.projects.run()API,结合mlflow.tracking,使得可以构建具有不同的项目(或入口点在同一个项目)作为单独的步骤的多步骤的工作流程。每次调用都会mlflow.projects.run()返回一个运行对象,您可以使用它 mlflow.tracking来确定运行何时结束并获取其输出工件。然后,这些伪像可以被传递到另一个步骤,该步骤需要pathuri参数。您可以在单个Python程序中协调所有工作流,该程序查看每个步骤的结果,并使用自定义代码决定接下来要提交的内容。一些示例用于多步骤工作流的案例包括:

模块化您的数据科学代码

不同的用户可以发布可重用的步骤,用于数据特征化,培训,验证等,其他用户或团队可以在他们的工作流程中运行。由于MLflow支持Git版本控制,因此另一个团队可以将其工作流程锁定到项目的特定版本,或者按照自己的计划升级到新版本。

超参数调整

使用mlflow.projects.run()您可以在本地计算机上或在像Databricks这样的云平台上并行启动多个运行。然后,您的驱动程序可以实时检查每次运行的指标,以取消运行,启动新运行或选择目标指标上运行最佳的运行。

交叉验证

有时您希望在培训和验证数据的不同随机分组上运行相同的培训代码。使用MLflow项目,您可以以允许此方式打包项目,例如,通过将列车/验证拆分的随机种子作为参数,或者首先调用可以拆分输入数据的另一个项目。

有关如何构建此类多步骤工作流的示例,请参阅MLflow Multistep 工作流示例项目

 

转载于:https://my.oschina.net/u/269325/blog/3078305

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值