工件存储
工件存储是 MLflow Tracking 中的一个核心组件,MLflow 在其中存储每个运行的大型工件(通常很大),例如模型权重(例如,pickle 化的 scikit-learn 模型)、图像(例如,PNG)、模型和数据文件(例如,Parquet 文件)。 请注意,像参数、指标和标签这样的元数据存储在后端存储(例如,PostGres、MySQL 或 MSSQL 数据库)中,这是 MLflow Tracking 的另一个组件。
配置工件存储
默认情况下,MLflow 将工件存储在本地(文件系统)./mlruns
目录中,但也支持各种适合存储大型数据的位置:Amazon S3、Azure Blob Storage、Google Cloud Storage、SFTP 服务器和 NFS。 您可以通过 MLflow Tracking 服务器连接这些远程存储。 有关如何连接到您选择的远程存储的指导,请参阅跟踪服务器设置和支持的存储中针对您的存储的特定部分。
管理工件存储访问权限
要允许服务器和客户端访问工件位置,您应该像在任何其他容量中访问它们一样配置您的云提供商凭据。 例如,对于 S3,您可以设置 AWS_ACCESS_KEY_ID
和 AWS_SECRET_ACCESS_KEY
环境变量,使用 IAM 角色,或者在 ~/.aws/credentials
中配置默认配置文件。
工件存储位置的凭据和配置的访问是在跟踪服务器初始化期间配置一次,而不是必须通过客户端 API 为基于工件的操作提供访问凭据。 请注意,在这种模式下,所有有权访问跟踪服务器的用户都将有权访问通过此假定角色提供的工件。
设置访问超时
您可以设置环境变量 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 上还是在 S3 兼容的替代方案上,例如 MinIO 或 Digital Ocean Spaces) 中存储工件,请指定 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 端点
要在自定义端点中存储工件,请将 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_TLS
或 AWS_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 Storage
要在 Azure Blob Storage 中存储工件,请指定 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 Storage。 最后,如果您想使用 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_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)