MLflow 是一个开源平台,旨在管理整个机器学习生命周期。 Databricks 将其创建为一个内部项目,以解决他们自己的机器学习开发和部署过程中面临的挑战。 MLflow 随后于 2018 年 6 月作为开源项目发布。
作为管理完整生命周期的工具,MLflow包含以下组件。
可以在开发机器上安装所有这些功能,以便工程师可以随心所欲地进行实验,而不必担心搞乱生产安装。
用于安装和设置 MLflow 的所有文件都可以在我们的Github 存储库中找到。
MLFlow 文档列出了不少于 6 个安装 MLFlow 的选项。这可能看起来有点矫枉过正,但这些选项可以适应不同的数据库偏好和不同级别的网络复杂性。
最适合拥有多个团队使用大型数据集并构建本身可能变得相当大的模型的组织的选项如下所示。此选项需要设置三个服务器 - 跟踪服务器、PostgreSQL 数据库和 S3 对象存储 - 我们的实现将使用 MinIO。
跟踪服务器是工程师开发机器上用于访问 MLflow 功能的单一入口点。 (不要被它的名字所迷惑 - 它包含上面列出的所有组件 - 跟踪、模型、项目和存储库。)跟踪服务器使用 PostgreSQL 来存储实体。实体是运行、参数、指标、标签、注释和元数据。 (稍后将详细介绍运行情况。)我们实现中的跟踪服务器访问 MinIO 来存储工件。工件的示例有模型、数据集和配置文件。
如今工程师可以使用的现代工具的优点在于,您可以使用容器来模拟生产环境(包括工具选择和网络连接)。这就是我将在这篇文章中展示的内容。我将展示如何使用 Docker Compose 将上述服务器安装为在容器中运行的服务。此外,MLflow 的配置设置为您可以根据需要使用 MinIO 的现有实例。在这篇文章中,我将展示如何部署一个全新的 MinIO 实例,但我们的Github 存储库中的文件有一个“docker-compose”文件,该文件展示了如何连接到现有的 MinIO 实例。
下面是需要安装的所有内容的列表。此列表包括将成为容器中的服务的服务器(MinIO、Postgres 和 MLFlow),以及您将需要的 SDK(MinIO 和 MLflow)。
Docker 桌面
通过 Docker Compose 的 MLFlow 跟踪服务器
通过 Docker Compose 的 MinIO 服务器
通过 Docker Compose 的 PostgresSQL
通过 pip 安装 MLFlow SDK
MinIO SDK 通过 pip 安装
让我们从 Docker Desktop 开始,它将作为我们的 Docker Compose 服务的主机。
您可以在 Docker 站点上找到适合您的操作系统的安装。如果您要在 Mac 上安装 Docker Desktop,那么您需要知道您的 Mac 使用的芯片 - Apple 还是 Intel。您可以通过单击 Mac 左上角的 Apple 图标并单击“关于本机”菜单选项来确定这一点。
我们现在已准备好安装我们的服务。
MLFLow Tracking Server、PostgresSQL 和 MinIO 将使用如下所示的 Docker Compose 文件作为服务安装。
version: "3.3" services: db: restart: always image: postgres container_name: mlflow_db expose: - "${PG_PORT}" networks: - backend environment: - POSTGRES_USER=${PG_USER} - POSTGRES_PASSWORD=${PG_PASSWORD} - POSTGRES_DATABASE=${PG_DATABASE} volumes: - ./db_data:/var/lib/postgresql/data/ healthcheck: test: ["CMD", "pg_isready", "-p", "${PG_PORT}", "-U", "${PG_USER}"] interval: 5s timeout: 5s retries: 3 s3: restart: always image: minio/minio container_name: mlflow_minio volumes: - ./minio_data:/data ports: - "${MINIO_PORT}:9000" - "${MINIO_CONSOLE_PORT}:9001" networks: - frontend - backend environment: - MINIO_ROOT_USER=${MINIO_ROOT_USER} - MINIO_ROOT_PASSWORD=${MINIO_ROOT_PASSWORD} - MINIO_ADDRESS=${MINIO_ADDRESS} - MINIO_PORT=${MINIO_PORT} - MINIO_STORAGE_USE_HTTPS=${MINIO_STORAGE_USE_HTTPS} - MINIO_CONSOLE_ADDRESS=${MINIO_CONSOLE_ADDRESS} command: server /data healthcheck: test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"] interval: 30s timeout: 20s retries: 3 tracking_server: restart: always build: ./mlflow image: mlflow_server container_name: mlflow_server depends_on: - db ports: - "${MLFLOW_PORT}:5000" networks: - frontend - backend environment: - AWS_ACCESS_KEY_ID=${MINIO_ACCESS_KEY} - AWS_SECRET_ACCESS_KEY=${MINIO_SECRET_ACCESS_KEY} - MLFLOW_S3_ENDPOINT_URL=http://s3:${MINIO_PORT} - MLFLOW_S3_IGNORE_TLS=true command: > mlflow server --backend-store-uri postgresql://${PG_USER}:${PG_PASSWORD}@db:${PG_PORT}/${PG_DATABASE} --host 0.0.0.0 --serve-artifacts --artifacts-destination s3://${MLFLOW_BUCKET_NAME} healthcheck: test: ["CMD", "curl", "-f", "http://localhost:${MLFLOW_PORT}/"] interval: 30s timeout: 10s retries: 3 volumes: db_data: minio_data: networks: frontend: driver: bridge backend: driver: bridge
有一些值得注意的事项可以帮助您在出现问题时解决问题。首先,MinIO和PostgreSQL都使用本地文件系统来存储数据。对于 PostgreSQL,这是“db_data”文件夹,对于 MinIO,这是“minio_data”文件夹。如果您想重新开始全新安装,请删除这些文件夹。
接下来,这个 Docker Compose 文件是配置驱动的。例如,该名称不是将 PostgreSQL 数据库名称硬编码为“mlflow”,而是来自下面所示的“config.env”文件,在 Docker Compose 文件中使用以下语法 -“${PG_DATABASE}”。
# Postgres configuration PG_USER=mlflow PG_PASSWORD=mlflow PG_DATABASE=mlflow PG_PORT=5432 # MLflow configuration MLFLOW_PORT=5000 MLFLOW_BUCKET_NAME=mlflow # MinIO access keys - these are needed by MLflow MINIO_ACCESS_KEY=XeAMQQjZY2pTcXWfxh4H MINIO_SECRET_ACCESS_KEY=wyJ30G38aC2UcyaFjVj2dmXs1bITYkJBcx0FtljZ # MinIO configuration MINIO_ROOT_USER: 'minio_user' MINIO_ROOT_PASSWORD: 'minio_pwd' MINIO_ADDRESS: ':9000' MINIO_STORAGE_USE_HTTPS: False MINIO_CONSOLE_ADDRESS: ':9001' MINIO_PORT=9000 MINIO_CONSOLE_PORT=9001
这些服务所需的所有环境变量都在此文件中设置。此配置文件还包含这些服务相互通信所需的信息。请注意,环境变量的使用通知 MLFlow Tracking 服务器如何访问 MinIO。换句话说,URL(包括端口号)、访问密钥、秘密访问密钥和存储桶。这引出了关于使用 Docker Compose 的最后也是最重要的一点 - 第一次启动这些服务时,MLflow Tracking 服务将不起作用,因为您需要首先进入 MinIO UI,获取密钥并创建存储桶跟踪服务将使用它来存储工件。
我们现在就这样做吧。使用以下命令首次启动服务。
docker-compose --env-file config.env up -d --build
确保在 Docker Compose 文件所在的同一目录中运行此命令。
现在我们可以使用 MinIO UI 获取密钥并创建存储桶。
从浏览器中转到“localhost:9001”。如果您在“docker-compose”文件中为 MinIO 控制台地址指定了不同的端口,请改用该端口。使用“config.env”文件中指定的 root 用户和密码登录。
登录后,导航至“访问密钥”选项卡,然后单击“创建访问密钥”按钮。
这将带您进入“创建访问密钥”页面。
在单击“创建”按钮之前,不会保存您的访问密钥和秘密密钥。完成此操作之前,请勿离开此页面。不必担心从此屏幕复制密钥。单击“创建”按钮后,您将可以选择将密钥下载到您的文件系统(在 JSON 文件中)。如果您想使用 MinIO SDK 来管理原始数据,请在此页面上创建另一个访问密钥和秘密密钥。
接下来,创建一个名为“mlflow”的存储桶。这很简单,进入“存储桶”选项卡并单击“创建存储桶”按钮。
获得密钥并创建存储桶后,您可以通过停止容器、更新“config.env”,然后重新启动容器来完成服务设置。下面的命令将停止并删除您的容器。
docker-compose down
重启:
docker-compose --env-file config.env up -d --build
接下来让我们启动 MLflow UI 并确保一切正常。
导航到“localhost:5000”。您应该会看到 MLflow UI。
花一些时间探索所有选项卡。如果您是 MLflow 的新手,请熟悉运行和实验的概念。
MLflow Python 包是一个简单的“pip”安装。我建议将其安装在Python虚拟环境中。
pip install mlflow
通过列出 MLflow 库来仔细检查安装。
pip list | grep mlflow
您应该会看到下面的库。
mlflow 2.5.0
您无需直接访问 MinIO 即可利用 MLflow 功能 - MLflow SDK 将与我们上面设置的 MinIO 实例进行交互。但是,您可能希望在将数据提供给 MLflow 之前直接与 MinIO 的此实例进行交互以管理数据。 MinIO 是存储各种非结构化数据的好方法。 MinIO 充分利用底层硬件,因此您可以保存所需的所有原始数据,而无需担心规模或性能。 MinIO 包括存储桶复制功能,可保持多个位置的数据同步。此外,有一天人工智能将会受到监管;当这一天到来时,您将需要 MinIO 的企业功能(对象锁定、 版本控制、加密和合法锁定)来保护您的静态数据并确保您不会意外删除监管机构可能要求的内容。
如果您在虚拟环境中安装了 MLflow Python 包,请在同一环境中安装 MinIO。
pip install minio
仔细检查安装。
pip list | grep minio
这将确认 Minio 库已安装并显示您正在使用的版本。
minio 7.1.15
这篇文章提供了在开发机器上设置 MLflow 和 MinIO 的简单易懂的方法。目标是节省您研究 MLflow 服务器和 docker-compose 配置的时间和精力。
我们尽一切努力保持这个食谱的准确性。如果您遇到问题,请通过[email protected]给我们留言或加入我们的Slack 通用频道的讨论来告知我们。
您已准备好开始使用 MLflow 和 MinIO 进行编码和训练模型。
也发布在这里。