在 Azure Databricks 上运行 MLflow 项目

MLflow 项目是一种用于以可重用和可重现的方式打包数据科学代码的格式。 MLflow 项目组件包括用于运行项目的 API 和命令行工具,这些工具还与跟踪组件集成,以自动记录源代码的参数和 Git 提交,实现可重现性。

本文介绍了 MLflow 项目的格式,以及如何使用 MLflow CLI 在 Azure Databricks 群集上远程运行 MLflow 项目,以轻松纵向缩放数据科学代码。

MLflow 项目格式

任何本地目录或 Git 存储库都可以视为 MLflow 项目。 项目使用以下约定进行定义:

  • 项目的名称是目录的名称。
  • 软件环境在 python_env.yaml 中指定(如果存在)。 如果不存在 python_env.yaml 文件,MLflow 在运行项目时使用仅包含 Python(特别是可用于 virtualenv 的最新 Python)的 virtualenv 环境。
  • 项目中的任何 .py.sh 文件都可以是入口点,不显式声明参数。 当使用一组参数运行此类命令时,MLflow 会使用 --key <value> 语法在命令行上传递每个参数。

可通过添加 MLproject 文件来指定更多选项,MLproject 文件是 YAML 语法中的文本文件。 示例 MLproject 文件如下所示:

name: My Project

python_env: python_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}"

运行 MLflow 项目

若要在默认工作区中的 Azure Databricks 群集上运行 MLflow 项目,请使用以下命令:

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

其中,<uri> 是包含 MLflow 项目的 Git 存储库 URI 或文件夹,<json-new-cluster-spec> 是包含 new_cluster 结构的 JSON 文档。 Git URI 的格式应为:https://github.com/<repo>#<project-folder>

群集规范示例如下:

{
  "spark_version": "7.3.x-scala2.12",
  "num_workers": 1,
  "node_type_id": "Standard_DS3_v2"
}

如果需要在辅助角色上安装库,请使用“群集规范”格式。 请注意,Python wheel 文件必须上传到 DBFS 并指定为 pypi 依赖项。 例如:

{
  "new_cluster": {
    "spark_version": "7.3.x-scala2.12",
    "num_workers": 1,
    "node_type_id": "Standard_DS3_v2"
  },
  "libraries": [
    {
      "pypi": {
        "package": "tensorflow"
      }
    },
    {
      "pypi": {
         "package": "/dbfs/path_to_my_lib.whl"
      }
    }
  ]
}

重要

  • MLflow 项目不支持 .egg.jar 依赖项。
  • 不支持使用 Docker 环境执行 MLflow 项目。
  • 在 Databricks 上运行 MLflow 项目时,必须使用新的群集规范。 不支持对现有群集运行项目。

使用 SparkR

若要在 MLflow 项目运行中使用 SparkR,项目代码必须首先安装并导入 SparkR,如下所示:

if (file.exists("/databricks/spark/R/pkg")) {
    install.packages("/databricks/spark/R/pkg", repos = NULL)
} else {
    install.packages("SparkR")
}

library(SparkR)

这样项目才可以初始化 SparkR 会话并正常使用 SparkR:

sparkR.session()
...

示例

此示例展示了如何创建试验,在 Azure Databricks 群集上运行 MLflow 教程项目,查看作业运行输出以及查看试验中的运行情况。

要求

  1. 使用 pip install mlflow 安装 MLflow。
  2. 安装并配置 Databricks CLI。 在 Azure Databricks 群集上运行作业需要 Databricks CLI 身份验证机制。

步骤 1:创建试验

  1. 在工作区中,选择“创建”>“MLflow 试验”。

  2. 在“名称”字段中,输入 Tutorial

  3. 单击“创建”。 记下试验 ID。 在此示例中,它是 14622565

    试验 ID

步骤 2:运行 MLflow 教程项目

以下步骤设置 MLFLOW_TRACKING_URI 环境变量并运行项目,将训练参数、指标和训练模型记录到前一步中提到的试验中:

  1. MLFLOW_TRACKING_URI 环境变量设置为 Azure Databricks 工作区。

    export MLFLOW_TRACKING_URI=databricks
    
  2. 运行 MLflow 教程项目,训练酒品模型。 将 <experiment-id> 替换为上一步中记下的试验 ID。

    mlflow run https://github.com/mlflow/mlflow#examples/sklearn_elasticnet_wine -b databricks --backend-config cluster-spec.json --experiment-id <experiment-id>
    
    === Fetching project from https://github.com/mlflow/mlflow#examples/sklearn_elasticnet_wine into /var/folders/kc/l20y4txd5w3_xrdhw6cnz1080000gp/T/tmpbct_5g8u ===
    === Uploading project to DBFS path /dbfs/mlflow-experiments/<experiment-id>/projects-code/16e66ccbff0a4e22278e4d73ec733e2c9a33efbd1e6f70e3c7b47b8b5f1e4fa3.tar.gz ===
    === Finished uploading project to /dbfs/mlflow-experiments/<experiment-id>/projects-code/16e66ccbff0a4e22278e4d73ec733e2c9a33efbd1e6f70e3c7b47b8b5f1e4fa3.tar.gz ===
    === Running entry point main of project https://github.com/mlflow/mlflow#examples/sklearn_elasticnet_wine on Databricks ===
    === Launched MLflow run as Databricks job run with ID 8651121. Getting run status page URL... ===
    === Check the run's status at https://<databricks-instance>#job/<job-id>/run/1 ===
    
  3. 复制 MLflow 运行输出的最后一行中的 URL https://<databricks-instance>#job/<job-id>/run/1

步骤 3:查看 Azure Databricks 作业运行

  1. 在浏览器中打开在上一步中复制的 URL 以查看 Azure Databricks 作业运行输出:

    作业运行输出

步骤 4:查看试验和 MLflow 运行详细信息

  1. 导航到 Azure Databricks 工作区中的试验。

    转到试验

  2. 单击试验。

    查看试验

  3. 若要显示运行详细信息,请单击 Date 列中的链接。

    运行详细信息

通过单击作业输出字段中的日志链接,可以查看运行中的日志。

资源

如需了解一些 MLflow 项目示例,请参阅 MLflow 应用库,该库包含一个现成的项目存储库,旨在使代码中易于包含 ML 功能。