工件存储

工件存储是 MLflow Tracking 中的一个核心组件,MLflow 在其中存储每个运行的工件(通常是大型文件),例如模型权重(例如,一个pickled的scikit-learn模型)、图像(例如,PNG文件)、模型和数据文件(例如,Parquet 文件)。请注意,像参数、指标和标签这样的元数据存储在 后端存储 中(例如,PostGres、MySQL或MSSQL数据库),这是MLflow Tracking的另一个组件。

配置一个工件存储库

MLflow 默认将工件存储在本地 ./mlruns 目录中,但也支持适合大数据的各种位置:Amazon S3、Azure Blob Storage、Google Cloud Storage、SFTP 服务器和 NFS。您可以通过 MLflow Tracking 服务器连接这些远程存储。有关如何连接到您选择的远程存储的指导,请参阅 tracking server setup 以及 supported storages 中适用于您存储的特定部分。

管理工件存储访问

为了允许服务器和客户端访问工件位置,您应该像在任何其他情况下访问它们一样配置您的云提供商凭证。例如,对于S3,您可以设置 AWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEY 环境变量,使用IAM角色,或在 ~/.aws/credentials 中配置默认配置文件。

重要

工件存储位置的访问凭证和配置在服务器初始化期间**一次性配置**,而不是让用户处理基于工件操作的访问凭证。请注意,在此模式下有权访问跟踪服务器的所有用户都将能够访问通过此假设角色提供的工件

设置访问超时

你可以设置环境变量 MLFLOW_ARTIFACT_UPLOAD_DOWNLOAD_TIMEOUT (以秒为单位)来配置工件上传和下载的超时时间。如果未设置,MLflow 将使用底层存储客户端库的默认超时时间(例如,S3 的 boto3)。请注意,这是一个实验性功能,可能会更改或移除。

为日志记录设置默认的工件位置

MLflow 会自动将 artifact_uri 属性记录为 mlflow.entities.RunInfo 的一部分,因此您可以使用 mlflow.get_artifact_uri() API 检索历史运行中工件的位置。此外,artifact_location 是记录在 mlflow.entities.Experiment 上的属性,用于设置在给定实验中所有运行的默认工件存储位置。

重要

如果在创建实验时未指定 --default-artifact-root 或工件 URI(例如,mlflow experiments create --artifact-location s3://<my-bucket>),则工件根目录将被设置为本地文件存储(执行运行的计算机硬盘)内的路径。通常这不是一个合适的位置,因为客户端和服务器可能指向不同的物理位置(即不同磁盘上的相同路径)。

Artifact Store 支持的存储类型

Amazon S3 和 S3 兼容存储

要在 S3 存储工件(无论是 Amazon S3 还是 S3 兼容的替代方案,如 MinIODigital Ocean Spaces),请指定一个形式为 s3://<bucket>/<path> 的 URI。MLflow 从您机器的 IAM 角色、~/.aws/credentials 中的配置文件或环境变量 AWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEY 获取访问 S3 的凭证,具体取决于这些凭证的可用性。有关如何设置凭证的更多信息,请参阅 设置 AWS 凭证和区域以进行开发

以下是配置S3存储访问时常用的环境变量。S3客户端的完整可配置参数列表可在 boto3文档 中找到。

向 S3 上传传递额外参数

要添加S3文件上传额外参数,请将 MLFLOW_S3_UPLOAD_EXTRA_ARGS 设置为一个键/值对的JSON对象。例如,如果你想使用KMS密钥1234上传到KMS加密的存储桶:

export MLFLOW_S3_UPLOAD_EXTRA_ARGS='{"ServerSideEncryption": "aws:kms", "SSEKMSKeyId": "1234"}'

有关可用额外参数的列表,请参阅 Boto3 ExtraArgs 文档

设置自定义 S3 端点

要在自定义端点存储工件,请将 MLFLOW_S3_ENDPOINT_URL 设置为您的端点 URL。例如,如果您使用的是 Digital Ocean Spaces:

export MLFLOW_S3_ENDPOINT_URL=https://<region>.digitaloceanspaces.com

如果你在 1.2.3.4 的 9000 端口上有一个 MinIO 服务器:

export MLFLOW_S3_ENDPOINT_URL=http://1.2.3.4:9000

使用非TLS认证

如果 MinIO 服务器配置为使用 SSL 自签名证书或由某些仅限内部的 CA 证书签名,您可以设置 MLFLOW_S3_IGNORE_TLSAWS_CA_BUNDLE 变量(不能同时设置两者!)来分别禁用证书签名检查或添加自定义 CA 包以执行此检查:

export MLFLOW_S3_IGNORE_TLS=true
#or
export AWS_CA_BUNDLE=/some/ca/bundle.pem

设置存储桶区域

此外,如果 MinIO 服务器配置了非默认区域,您应该设置 AWS_DEFAULT_REGION 变量:

export AWS_DEFAULT_REGION=my_region

警告

MLflow 跟踪服务器使用特定的保留关键字来生成合格的路径。这些环境配置,如果存在于客户端环境中,可能会导致路径解析问题。例如,在服务器端提供 --default-artifact-root $MLFLOW_S3_ENDPOINT_URL 并且 在客户端提供 MLFLOW_S3_ENDPOINT_URL 将导致客户端在解析工件存储位置时出现问题。在解析工件存储位置时,MLflow 客户端将使用 --default-artifact-root 提供的值,并将该位置附加环境变量 MLFLOW_S3_ENDPOINT_URL 中的值。根据环境变量 MLFLOW_S3_ENDPOINT_URL 的设置值,此场景的最终工件存储路径将是以下无效对象存储路径之一: https://<bucketname>.s3.<region>.amazonaws.com/<key>/<bucketname>/<key>s3://<bucketname>/<key>/<bucketname>/<key>。为防止路径解析问题,请确保从客户端环境中移除(``unset``)保留的环境变量

Azure Blob 存储

要在 Azure Blob 存储中存储工件,请指定以下形式的 URI:wasbs://<container>@<storage-account>.blob.core.windows.net/<path>。MLflow 期望您的 Azure 存储访问凭据位于 AZURE_STORAGE_CONNECTION_STRINGAZURE_STORAGE_ACCESS_KEY 环境变量中,或者您的凭据已配置,以便 DefaultAzureCredential() 类可以获取它们。优先顺序为:

  1. AZURE_STORAGE_CONNECTION_STRING

  2. AZURE_STORAGE_ACCESS_KEY

  3. DefaultAzureCredential()

你必须在你的 客户端应用程序和 MLflow 跟踪服务器 上设置这些选项中的一个。此外,你必须分别在客户端和服务器上运行 pip install azure-storage-blob 以访问 Azure Blob 存储。最后,如果你想使用 DefaultAzureCredential,你必须 pip install azure-identity;MLflow 默认不声明对这些包的依赖。

您可以设置一个 MLflow 环境变量来配置工件上传和下载的超时时间:

  • MLFLOW_ARTIFACT_UPLOAD_DOWNLOAD_TIMEOUT - (实验性,可能会更改或移除) 设置工件上传/下载的超时时间,单位为秒 (默认值:Azure blob 为 600)。

Google 云存储

要在 Google Cloud Storage 中存储工件,请指定形式为 gs://<bucket>/<path> 的 URI。您应按照 GCS 文档 中的描述,为客户端和服务器配置访问 GCS 容器的凭证。最后,您必须在客户端和服务器上运行 pip install google-cloud-storage 以访问 Google Cloud Storage;MLflow 默认不声明对此包的依赖。

您可以设置一些 MLflow 环境变量来解决 GCS 读取超时问题(例如,由于传输速度慢),使用以下变量:

  • MLFLOW_ARTIFACT_UPLOAD_DOWNLOAD_TIMEOUT - (实验性,可能会更改或移除) 设置传输操作的标准超时时间,单位为秒 (默认值: GCS 为 60)。使用 -1 表示无限超时。

  • MLFLOW_GCS_DEFAULT_TIMEOUT - (已弃用,请使用 MLFLOW_ARTIFACT_UPLOAD_DOWNLOAD_TIMEOUT) 设置传输操作的标准超时时间,单位为秒(默认值:60)。使用 -1 表示无限超时。

  • MLFLOW_GCS_UPLOAD_CHUNK_SIZE - 设置较大文件的标准上传块大小,单位为字节(默认值:104857600 ≙ 100MiB),必须是256KB的倍数。

  • MLFLOW_GCS_DOWNLOAD_CHUNK_SIZE - 设置较大文件的标准下载块大小,单位为字节(默认值:104857600 ≙ 100MiB),必须是256 KB的倍数

FTP 服务器

要在 FTP 服务器上存储工件,请指定一个格式为 ftp://user@host/path/to/directory 的 URI。URI 可以选择性地包含用于登录服务器的密码,例如 ftp://user:pass@host/path/to/directory

SFTP 服务器

要在 SFTP 服务器上存储工件,请指定一个形式为 sftp://user@host/path/to/directory 的 URI。您应该配置客户端,使其能够通过 SSH 无密码登录到 SFTP 服务器(例如,公钥、ssh_config 中的身份文件等)。

支持使用 sftp://user:pass@host/ 格式进行登录。然而,出于安全考虑,不推荐这样做。

在使用此存储时,服务器和客户端都必须安装 pysftp。运行 pip install pysftp 以安装所需的包。

NFS

要在NFS挂载中存储工件,请将URI指定为普通文件系统路径,例如 /mnt/nfs 。此路径在服务器和客户端上必须相同——您可能需要使用符号链接或在客户端上重新挂载以强制执行此属性。

HDFS

要在 HDFS 中存储工件,请指定一个 hdfs: URI。它可以包含主机和端口:hdfs://<host>:<port>/<path> 或仅包含路径:hdfs://<path>

也有两种方式可以认证到HDFS:

  • 使用当前 UNIX 账户授权

  • 使用以下环境变量进行Kerberos凭证验证:

export MLFLOW_KERBEROS_TICKET_CACHE=/tmp/krb5cc_22222222
export MLFLOW_KERBEROS_USER=user_name_to_use

HDFS 工件存储通过 pyarrow.fs 模块访问,有关所需的配置和环境变量,请参阅 PyArrow 文档

删除行为

为了允许恢复 MLflow 运行,当一个运行被删除时,运行元数据和工件不会自动从后端存储或工件存储中移除。提供了 mlflow gc CLI 用于永久删除已删除运行的元数据和工件。

代理工件访问的多部分上传

备注

此功能是实验性的,可能会在未来的版本中无通知地更改或移除。

Tracking Server 支持使用多部分上传来上传大型工件,以实现代理工件访问。要启用此功能,请将 MLFLOW_ENABLE_PROXY_MULTIPART_UPLOAD 设置为 true

export MLFLOW_ENABLE_PROXY_MULTIPART_UPLOAD=true

在底层,跟踪服务器将创建一个与底层存储的多部分上传请求,为每个部分生成预签名URL,并让客户端直接将这些部分上传到存储中。一旦所有部分上传完毕,跟踪服务器将完成多部分上传。没有任何数据会通过跟踪服务器。

如果底层存储不支持多部分上传,跟踪服务器将回退到单部分上传。如果支持多部分上传但因任何原因失败,将抛出异常。

MLflow 支持以下存储的代理工件访问的多部分上传:

  • Amazon S3

  • Google 云存储

您可以配置以下环境变量:

  • MLFLOW_MULTIPART_UPLOAD_MINIMUM_FILE_SIZE - 指定在记录工件时使用多部分上传的最小文件大小(以字节为单位)(默认值:500 MB)

  • MLFLOW_MULTIPART_UPLOAD_CHUNK_SIZE - 指定在进行多部分上传时使用的块大小(以字节为单位)(默认值:100 MB)