Artifact Stores
Artifact Store 是 MLflow Tracking 的一个核心组件,MLflow 在其中为每次运行存储(通常是大型)的 artifact,例如模型权重(如 pickle 化的 scikit-learn 模型)、图像(如 PNG)、模型和数据文件(如 Parquet 文件)。请注意,诸如参数、指标和标签之类的元数据存储在 backend store(例如 PostGres、MySQL 或 MSSQL 数据库)中,这是 MLflow Tracking 的另一个组件。
配置 Artifact Store
MLflow 默认将 artifact 存储在本地(文件系统)的 ./mlruns 目录中,但也支持各种适合大数据的位置:Amazon S3、Azure Blob Storage、Google Cloud Storage、SFTP 服务器和 NFS。您可以通过 MLflow Tracking 服务器连接这些远程存储。有关如何连接到您选择的远程存储的指导,请参阅 tracking server setup 和您存储的特定部分 supported storages。
管理 Artifact Store 访问
为了让服务器和客户端能够访问 artifact 位置,您应该像访问其他任何资源一样配置您的云提供商凭据。例如,对于 S3,您可以设置 AWS_ACCESS_KEY_ID 和 AWS_SECRET_ACCESS_KEY 环境变量,使用 IAM 角色,或在 ~/.aws/credentials 中配置默认配置文件。
Artifact Store 位置的凭据和配置是**在初始化 Tracking Server 时配置一次**,而不是通过客户端 API 为基于 artifact 的操作提供访问凭据。请注意,**在此模式下有权访问 Tracking Server 的所有用户都将能够访问通过此 Assume Role 提供的 artifact**。
设置访问超时
您可以设置环境变量 MLFLOW_ARTIFACT_UPLOAD_DOWNLOAD_TIMEOUT(以秒为单位)来配置 artifact 上传和下载的超时时间。如果未设置,MLflow 将使用底层存储客户端库(例如,S3 的 boto3)的默认超时。请注意,这是一个实验性功能,可能会根据需要进行修改。
为日志记录设置默认 Artifact 位置
MLflow 会自动记录 artifact_uri 属性作为 mlflow.entities.RunInfo 的一部分,以便您可以使用 mlflow.get_artifact_uri() API 检索历史运行的 artifact 位置。此外,artifact_location 是记录在 mlflow.entities.Experiment 上的一个属性,用于设置在给定实验中存储模型运行的所有 artifact 的默认位置。
如果您在创建实验时未指定 --default-artifact-root 或 artifact URI(例如,mlflow experiments create --artifact-location s3://<my-bucket>),则 artifact 根目录将设置为本地文件存储路径(运行所在计算机的硬盘)。这通常不是一个合适的位置,因为客户端和服务器可能指向不同的物理位置(即,不同磁盘或计算机上的同一路径)。
Artifact Store 支持的存储类型
Amazon S3 和 S3 兼容存储
要将 artifact 存储在 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 的凭据。有关如何设置凭据的更多信息,请参阅 Set up AWS Credentials and Region for Development。
以下是配置 S3 存储访问常用的环境变量。S3 客户端的可配置参数的完整列表可在 boto3 documentation 中找到。
向 S3 上传传递额外参数
要添加 S3 文件上传的额外参数,请将 MLFLOW_S3_UPLOAD_EXTRA_ARGS 设置为键/值对的 JSON 对象。例如,如果您想使用 KMS Key 1234 上传到 KMS 加密的存储桶
export MLFLOW_S3_UPLOAD_EXTRA_ARGS='{"ServerSideEncryption": "aws:kms", "SSEKMSKeyId": "1234"}'
有关可用额外参数的列表,请参阅 Boto3 ExtraArgs Documentation。
存储桶所有权验证
为了防止存储桶劫持攻击(即已删除的存储桶被另一个 AWS 账户重新创建),您可以将 MLFLOW_S3_EXPECTED_BUCKET_OWNER 设置为您 S3 存储桶所属的预期 AWS 账户 ID。
export MLFLOW_S3_EXPECTED_BUCKET_OWNER=123456789012
设置后,MLflow 将在所有 S3 API 调用中包含 ExpectedBucketOwner 参数。如果存储桶属于其他账户,S3 将拒绝该操作并返回访问被拒绝错误,从而防止未经授权的 artifact 访问。
这对于以下情况尤其重要:
- S3 存储桶名称在所有 AWS 账户中是全局唯一的
- 存储桶可能被攻击者以相同名称删除并重新创建
- MLflow 会不知情地将 artifact 发送到攻击者的存储桶
有关更多信息,请参阅 AWS S3 Bucket Owner Condition documentation。
设置自定义 S3 端点
要将 artifact 存储在自定义端点中,请将 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 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 Tracking Server 使用特定的保留关键字来生成合格路径。这些环境变量(如果存在于客户端环境中)可能会导致路径解析问题。例如,在服务器端提供 --default-artifact-root $MLFLOW_S3_ENDPOINT_URL **并且**在客户端提供 MLFLOW_S3_ENDPOINT_URL 将导致 artifact 存储位置的客户端路径解析问题。在解析 artifact 存储位置时,MLflow 客户端将使用 --default-artifact-root 提供的值,并将环境变量 MLFLOW_S3_ENDPOINT_URL 的值附加到该位置。根据环境变量 MLFLOW_S3_ENDPOINT_URL 的设置值,此场景下的 artifact 存储路径将是以下无效对象存储路径之一:https://<bucketname>.s3.<region>.amazonaws.com/<key>/<bucketname>/<key> 或 s3://<bucketname>/<key>/<bucketname>/<key>。为避免路径解析问题,**请确保从客户端环境中删除(unset)保留的环境变量**。
Azure Blob Storage
要将 artifact 存储在 Azure Blob Storage 中,请指定形式为 wasbs://<container>@<storage-account>.blob.core.windows.net/<path> 的 URI。MLflow 期望您的 Azure Storage 访问凭据位于 AZURE_STORAGE_CONNECTION_STRING 和 AZURE_STORAGE_ACCESS_KEY 环境变量中,或者您的凭据已配置,以便 DefaultAzureCredential() 类可以获取它们。优先级顺序如下:
AZURE_STORAGE_CONNECTION_STRINGAZURE_STORAGE_ACCESS_KEYDefaultAzureCredential()
您必须在**您的客户端应用程序和 MLflow Tracking Server 上**设置其中一个选项。此外,您必须单独运行 pip install azure-storage-blob(在客户端和服务器上)才能访问 Azure Blob Storage。最后,如果您想使用 DefaultAzureCredential,则必须 pip install azure-identity;MLflow 默认不声明对这些包的依赖。
您可以设置 MLflow 环境变量来配置 artifact 上传和下载的超时时间
MLFLOW_ARTIFACT_UPLOAD_DOWNLOAD_TIMEOUT-(实验性,可能会更改或删除)设置 artifact 上传/下载的超时时间(秒)(默认值:Azure Blob 为 600)。
Google Cloud Storage
要将 artifact 存储在 Google Cloud Storage 中,请指定形式为 gs://<bucket>/<path> 的 URI。您应该按照 GCS documentation 中的说明,在客户端和服务器上配置访问 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 服务器
要将 artifact 存储在 FTP 服务器中,请指定形式为 ftp://user@host/path/to/directory 的 URI。URI 可选地包含用于登录服务器的密码,例如 ftp://user:pass@host/path/to/directory
SFTP 服务器
要将 artifact 存储在 SFTP 服务器中,请指定形式为 sftp://user@host/path/to/directory 的 URI。您应该配置客户端,使其能够通过 SSH 无密码登录 SFTP 服务器(例如,公钥、ssh_config 中的身份文件等)。
支持 sftp://user:pass@host/ 格式的登录。但是,出于安全原因,不建议这样做。
使用此存储时,pysftp 必须同时安装在服务器和客户端上。运行 pip install pysftp 来安装必需的包。
NFS
要将 artifact 存储在 NFS 挂载中,请将 URI 指定为普通文件系统路径,例如 /mnt/nfs。此路径在服务器和客户端上必须相同——您可能需要使用符号链接或重新挂载客户端来强制执行此属性。
HDFS
要将 artifact 存储在 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 artifact store 使用 pyarrow.fs 模块访问,请参阅 PyArrow Documentation 获取配置和所需环境变量。
删除行为
为了能够恢复 MLflow Runs,当 Runs 被删除时,Run 元数据和 artifact 不会自动从 backend store 或 artifact store 中移除。提供 mlflow gc CLI 用于永久删除已删除 Runs 的 Run 元数据和 artifact。
代理 artifact 访问的分块上传
Tracking Server 支持使用分块上传来上传大型 artifact,用于代理 artifact 访问。要启用此功能,请将 MLFLOW_ENABLE_PROXY_MULTIPART_UPLOAD 设置为 true。
export MLFLOW_ENABLE_PROXY_MULTIPART_UPLOAD=true
在底层,Tracking Server 将与底层存储创建一个分块上传请求,为每个部分生成预签名 URL,并让客户端直接将部分上传到存储。所有部分上传完成后,Tracking Server 将完成分块上传。数据不会经过 Tracking Server。
如果底层存储不支持分块上传,Tracking Server 将回退到单部分上传。如果支持分块上传但因任何原因失败,将抛出异常。
MLflow 支持以下存储的分块上传,用于代理 artifact 访问
- Amazon S3
- Google Cloud Storage
您可以配置以下环境变量
MLFLOW_MULTIPART_UPLOAD_MINIMUM_FILE_SIZE- 指定使用分块上传记录 artifact 的最小文件大小(字节)(默认值:500 MB)MLFLOW_MULTIPART_UPLOAD_CHUNK_SIZE- 指定执行分块上传时使用的块大小(字节)(默认值:100 MB)