简介

MLflow 是一个简化机器学习开发的平台,包括跟踪实验、将代码打包以便于可再现的运行以及共享和部署模型。

MLflow 提供了一组轻量级 API,可用于任何现有的机器学习应用程序或库(TensorFlow、PyTorch、XGBoost 等),无论您当前在何处运行 ML 代码(例如:在笔记本电脑、独立应用程序或云平台中)。

机器学习工作流程

机器学习需要对广泛的数据集、数据准备步骤和算法进行试验,以构建最大化某些目标指标的模型。构建模型后,您还需要将其部署到生产系统,监控其性能,并根据新数据不断对其进行重新训练并与需要替代的模型进行比较。

因此,通过机器学习提高生产力可能具有挑战性,原因如下:

  • 很难跟踪实验。当您只是在笔记本电脑或交互式 notebook 上处理文件时,您如何判断哪些数据、代码和参数用于获得特定结果?
  • 很难重现代码。即使您已经细致地跟踪了代码版本和参数,您也需要捕获整个环境(例如,依赖库)才能再次获得相同的结果。如果您希望其他数据科学家使用您的代码,或者如果您想在另一个平台(例如,在云平台中)大规模运行相同的代码,这尤其具有挑战性。
  • 没有标准的方法来打包和部署模型。每个数据科学团队都为其使用的每个 ML 库提出了自己的方法,并且模型与生成它的代码和参数之间的链接经常丢失。
  • 没有中央存储来管理模型(它们的版本和阶段变迁)。数据科学团队创建了许多模型。由于缺乏协作和管理模型生命周期的中心位置,数据科学团队在如何管理模型阶段方面面临挑战:从开发到登台,最后到归档或生产,以及各自的版本、注释和历史。

此外,尽管单个 ML 库为其中一些问题(例如:模型服务)提供了解决方案,但为了获得最佳结果,您通常需要尝试多个 ML 库。 MLflow 让您可以使用任何库训练、重用和部署模型,并将它们打包成可重复的步骤,其他数据科学家可以将其用作“黑匣子”,甚至无需知道您使用的是哪个库。

设计理念

MLflow 的核心理念是尽可能少地限制您的工作流程:它旨在与任何机器学习库一起使用,按照惯例(约定)确定有关您的代码的大部分内容,并且只需要最少的更改即可集成到现有的代码库中。 MLflow 的目标是获取以其格式编写的任何代码库,并使其可复现和可重复使用,可供多个数据科学家使用。

MLflow 组件

MLflow 目前提供四个组件:跟踪(Tracking)、项目(Projects)、模型(Models)和模型注册表(Model Registry)。 您可以单独使用这些组件中的每一个。例如,也许您想以 MLflow 的模型格式导出模型,而不使用 Tracking 或 Projects,但它们也可以很好地协同工作。

  • MLflow Tracking:通过 API 的形式记录机器学习实验中的参数、代码和结果,并使用交互式 UI 进行比较。
  • MLflow Projects:使用 Conda 和 Docker 将可重复运行的代码打包;因此,您可以与他人共享您的 ML 代码。
  • MLflow Models:一种模型打包格式和工具,让您可以轻松地将相同的模型(来自任何 ML 库)部署到 Docker、Apache Spark、Azure ML 和 AWS SageMaker 等平台上的批处理和实时评分。
  • MLflow Model Registry:一个集中式模型仓库,通过 API 和 UI 用于协作管理 MLflow 模型的整个生命周期。

MLflow 特点

  • 适用于任何 ML 库、语言和现有的代码
  • 在任何云中以相同的方式运行
  • 为从 1 个用户扩展到大型组织而设计
  • 使用 Apache Spark 处理规模化的大数据

引用制品

当您在 MLflow API 中指定制品的位置时,语法取决于您是调用的 Tracking、Models 还是 Projects 的 API。 对于 Tracking API,您可以使用(运行 ID,相对路径)元组指定制品位置。 对于 Models 和 Projects API,您可以通过以下方式指定制品位置:

  • /Users/me/path/to/local/model
  • relative/path/to/local/model
  • <scheme>/<scheme-dependent-path>

例如:

  • s3://my_bucket/path/to/model
  • hdfs://<host>:<port>/<path>
  • runs:/<mlflow_run_id>/run-relative/path/to/model
  • models:/<model_name>/<model_version>
  • models:/<model_name>/<stage>
  • mlflow-artifacts:/path/to/model (在 --serve-artifacts 代理模式下运行跟踪服务时)

Tracking API 示例:

mlflow.log_artifacts("<mlflow_run_id>", "/path/to/artifact")

Models API 示例:

mlflow.pytorch.log_model("runs:/<mlflow_run_id>/run-relative/path/to/model", registered_model_name="mymodel")
mlflow.pytorch.load_model("models:/mymodel/1")

可扩展性和大数据

数据是机器学习获得良好结果的关键,因此, MLflow 旨在扩展到大型数据集、大型输出文件(例如:模型)和大量实验。具体来说,MLflow 支持四个维度的缩放:

  • 单个 MLflow 运行可以在分布式集群上执行,例如,使用 Apache Spark。您可以在您选择的分布式基础架构上启动运行并将结果报告给跟踪服务以进行比较。 MLflow 包含一个内置 API,用于在 Databricks 上启动运行。
  • MLflow 支持使用不同的参数并行启动多个运行,例如,用于超参数调优。您可以简单地使用 Projects API 来启动多个运行,并使用 Tracking API 来跟踪它们。
  • MLflow 项目可以从分布式存储系统(例如:AWS S3 和 DBFS)获取输入并将输出写入其中。 MLflow 可以为只能在本地文件上运行的项目自动在本地下载此类文件,或者如果支持,则为项目提供分布式存储 URI。这意味着您可以编写构建大型数据集的项目,例如:对一个 100 TB 的文件进行特征化处理。
  • MLflow 模型注册表为大型组织提供了一个中央枢纽,以协作管理完整的模型生命周期。组织内的许多数据科学团队开发了数百个模型,每个模型都有其实验、运行、版本、制品和阶段变迁。中央注册表有助于大型组织中多个团队的模型发现和了解模型的用途。

应用场景

无论您是单独工作的数据科学家还是大型组织的一部分,都可以通过多种方式使用 MLflow:

  • 个人数据科学家可以使用 MLflow Tracking 在他们的机器上本地跟踪实验,组织项目中的代码以供将来重用,并输出模型,然后生产工程师可以使用 MLflow 的部署工具进行部署。 MLflow Tracking 默认只是读写文件到本地文件系统,所以不需要部署服务

  • 数据科学团队可以部署 MLflow Tracking 服务来记录和比较处理同一问题的多个用户的结果。通过设置命名参数和指标的约定,他们可以尝试不同的算法来解决相同的问题,然后在新数据上再次运行相同的算法来比较未来的模型。此外,任何人都可以下载并运行另一个模型。

  • 大型组织可以使用 MLflow 共享项目、模型和结果。任何团队都可以使用 MLflow Projects运行另一个团队的代码,因此,组织可以打包其他团队可以使用的有用的训练和数据准备步骤,或者比较多个团队在同一任务上的结果。此外,工程团队可以轻松地将工作流程从研发转移到生产阶段。

  • 生产工程师可以以相同的方式部署来自不同 ML 库的模型,将模型作为文件存储在他们选择的管理系统中,并跟踪运行模型的来源。

  • 研究人员和开源开发人员可以以 MLflow Project 的格式将代码发布到 GitHub,使任何人都可以轻松地使用 mlflow run github.com/... 命令运行他们的代码。

  • ML 库开发人员可以输出 MLflow 模型格式的模型,让它们使用 MLflow 的内置工具自动支持部署。此外,部署工具开发人员(例如,构建服务平台的云供应商)可以自动支持多种模型。

更多推荐