使用 MLFlow 和 MinIO 设置开发机器
关于MLflow
MLflow 是一个开源平台,旨在管理整个机器学习生命周期。 Databricks 将其创建为一个内部项目,以解决他们自己的机器学习开发和部署过程中面临的挑战。 MLflow 随后于 2018 年 6 月作为开源项目发布。
作为管理完整生命周期的工具,MLflow包含以下组件。
- ML流跟踪 - 工程师最常使用此功能。 它允许记录和查询实验。 它还跟踪每个实验的代码、数据、配置和结果。
- MLflow 项目 - 允许通过将代码打包成与平台无关的格式来重现实验。
- MLflow 模型 - 将机器学习模型部署到可以提供服务的环境中。
- 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 的 PostgresQL
- 通过 pip 安装 MLFlow SDK
- MinIO SDK 通过 pip 安装
让我们从 Docker Desktop 开始,它将作为 Docker Compose 服务的主机。
Docker 桌面
您可以在 Docker 的站点上找到适合您的操作系统的适当的安装。 如果您要在 Mac 上安装 Docker Desktop,那么您需要知道您的 Mac 使用的芯片 - Apple 还是 Intel。 您可以通过单击 Mac 左上角的 Apple 图标并单击“关于本机”菜单选项来确定这一点。
我们现在准备安装我们的服务
MLFlow 服务器、Postgres 和 MinIO
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`,而是使用 Docker Compose 文件中的以下语法来自下面所示的 `config.env` 文件 - `${PG\ _数据库}`。
# 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 获取密钥并创建存储桶。
MiniIO 控制台
从浏览器中,转到“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 并确保一切正常。
启动 MLflow UI
导航到“localhost:5000”。 您应该会看到 MLflow UI。

花一些时间探索所有选项卡。 如果您是 MLflow 的新手,请熟悉运行和实验的概念。
- 运行是对代码的一次遍历,通常会产生经过训练的模型。
- 实验是一种标记相关运行的方法,以便您可以在 MLflow UI 中看到它们分组在一起。 例如,您可能已经使用不同的参数训练了多个模型,以尝试实现最佳准确性(或性能)。 使用相同的实验名称标记这些运行会将它们分组在“实验”选项卡中。
安装 MLflow Python 包。
MLflow Python 包是一个简单的 pip 安装。 我建议将其安装在Python虚拟环境中。
pip install mlflow
通过列出 MLflow 库来仔细检查安装。
pip list | grep mlflow
您应该会看到下面的库。
mlflow 2.5.0
安装 MinIO Python 包
您无需直接访问 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 配置的时间和精力。
我们尽一切努力保持这个食谱的准确性。 如果您遇到问题,请通过 `sales@minio.org.cn 给我们留言或加入我们的 [一般 Slack 频道](https://slack .min.io/?ref=blog.min.io)。
您已准备好开始使用 MLflow 和 MinIO 进行编码和训练模型。