工件存储
工件存储是 MLflow 跟踪 的核心组件,MLflow 在其中存储每个运行的工件(通常较大),例如模型权重(例如 pickled scikit-learn 模型)、图像(例如 ONGs)、模型和数据文件(例如 Parquet 文件)。请注意,参数、指标和标签等元数据存储在 后端存储 中(例如,PostGres、MySQL 或 MSSQL 数据库),它是 MLflow 跟踪 的另一个组件。
配置工件存储
MLflow 默认将工件存储在本地的 ./mlruns
目录中,但也支持适用于大数据量的各种位置:Amazon S3、Azure Blob Storage、Google Cloud Storage、SFTP 服务器和 NFS。您可以通过 MLflow 跟踪服务器 连接这些远程存储。有关如何连接到您选择的远程存储的指导,请参阅 跟踪服务器设置 以及 受支持存储 中关于您的存储的特定部分。
管理工件存储访问
要允许服务器和客户端访问工件位置,您应配置您的云提供商凭据,就像您在任何其他场景中访问它们一样。例如,对于 S3,您可以设置 AWS_ACCESS_KEY_ID
和 AWS_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>
),则工件根目录将设置为本地文件存储(执行您运行的计算机的硬盘)中的路径。通常这不是一个合适的位置,因为客户端和服务器可能指向不同的物理位置(即,不同磁盘上的相同路径)。
工件存储支持的存储类型
Amazon S3 和兼容 S3 的存储
要将工件存储在 S3 中(无论是在 Amazon S3 上还是在 MinIO 或 Digital Ocean Spaces 等兼容 S3 的替代方案上),请指定形式为 s3://<bucket>/<path>
的 URI。MLflow 从您的机器的 IAM 角色、~/.aws/credentials
中的配置文件或环境变量 AWS_ACCESS_KEY_ID
和 AWS_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 Endpoint
要将工件存储在自定义 endpoint 中,请将 MLFLOW_S3_ENDPOINT_URL
设置为您 endpoint 的 URL。例如,如果您使用的是 Digital Ocean Spaces
export MLFLOW_S3_ENDPOINT_URL=https://<region>.digitaloceanspaces.com
如果您在端口 9000 上有位于 1.2.3.4 的 MinIO 服务器
export MLFLOW_S3_ENDPOINT_URL=http://1.2.3.4:9000
使用非 TLS 认证
如果 MinIO 服务器配置为使用 SSL 自签名或使用某些内部专用 CA 证书进行签名,您可以设置 MLFLOW_S3_IGNORE_TLS
或 AWS_CA_BUNDLE
变量(不要同时设置两者!)以禁用证书签名检查,或分别添加自定义 CA bundle 来执行此检查。
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 存储 中,请指定形式为 wasbs://<container>@<storage-account>.blob.core.windows.net/<path>
的 URI。MLflow 希望您的 Azure 存储访问凭据位于 AZURE_STORAGE_CONNECTION_STRING
和 AZURE_STORAGE_ACCESS_KEY
环境变量中,或者您的凭据已配置,以便 DefaultAzureCredential() 类能够获取它们。优先级顺序为
AZURE_STORAGE_CONNECTION_STRING
AZURE_STORAGE_ACCESS_KEY
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 Cloud Storage
要将工件存储在 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),必须是 256 KB 的倍数。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 工具用于永久移除已删除运行的运行元数据和工件。
代理工件访问的多部分上传
此功能为实验性功能,可能会在未来的版本中更改或移除,恕不另行通知。
跟踪服务器支持使用多部分上传来上传大型工件以进行代理工件访问。要启用此功能,请将 MLFLOW_ENABLE_PROXY_MULTIPART_UPLOAD
设置为 true
。
export MLFLOW_ENABLE_PROXY_MULTIPART_UPLOAD=true
在底层,跟踪服务器将与底层存储创建多部分上传请求,为每个部分生成预签名 URL,并允许客户端将这些部分直接上传到存储中。一旦所有部分上传完毕,跟踪服务器将完成多部分上传。任何数据都不会通过跟踪服务器。
如果底层存储不支持多部分上传,跟踪服务器将回退到单个部分上传。如果支持多部分上传但因任何原因失败,将抛出异常。
MLflow 支持对以下存储进行代理工件访问的多部分上传
- Amazon S3
- Google Cloud Storage
您可以配置以下环境变量
MLFLOW_MULTIPART_UPLOAD_MINIMUM_FILE_SIZE
- 指定记录工件时使用多部分上传的最小文件大小(以字节为单位)(默认值:500 MB)MLFLOW_MULTIPART_UPLOAD_CHUNK_SIZE
- 指定执行多部分上传时使用的块大小(以字节为单位)(默认值:100 MB)