MlFlow - 无法 运行 将 S3 作为默认工件根

MlFlow - Unable to run with S3 as default-artifact-root

我正在尝试使用 mlflow 将我的模型工件存储到 s3。在 API 服务中,我们使用 MLFLOW_S3_ENDPOINT_URL 作为 s3 存储桶。在 mlflow 服务中,我们将其作为环境变量传递。但是,mlflow 容器服务程序失败并出现以下异常:

mflow_server  | botocore.exceptions.HTTPClientError: An HTTP Client raised an unhandled exception: Not supported URL scheme s3

docker-编写文件如下:

version: "3.3"
services:
  prisim-api:
    image: prisim-api:latest
    container_name: prisim-api
    expose:
      - "8000"
    environment: 
    - S3_URL=s3://mlflow-automation-artifacts/
    - MLFLOW_SERVER=http://mlflow:5000
    - AWS_ID=xyz+
    - AWS_KEY=xyz

    networks:
      - prisim 
    depends_on:
      - mlflow
    links:
            - mlflow
    volumes:
      - app_data:/usr/data
  mlflow:
    image: mlflow_server:latest
    container_name: mflow_server
    ports:
      - "5000:5000"    
    environment:
      - AWS_ACCESS_KEY_ID=xyz+
      - AWS_SECRET_ACCESS_KEY=xyz
      - MLFLOW_S3_ENDPOINT_URL=s3://mlflow-automation-artifacts/
    healthcheck:
      test: ["CMD", "echo", "mlflow server is running"]
      interval: 1m30s
      timeout: 10s
      retries: 3
    networks:
       - prisim 
networks:
 prisim:
volumes:
  app_data:

为什么不支持方案s3?

我对 miflow 的经验为 0,尽管我在文档中看到的是您使用了错误的环境变量来设置 S3 存储桶。或者更准确地说,您尝试执行的操作似乎没有环境变量。

MLFLOW_S3_ENDPOINT_URL 应在您不将 AWS 用于 S3 且期望正常 API url(以 http/https 开头)的情况下使用。来自 documentation:

To store artifacts in a custom endpoint, set the MLFLOW_S3_ENDPOINT_URL to your endpoint’s URL. For example, if you have a MinIO server at 1.2.3.4 on port 9000:

export MLFLOW_S3_ENDPOINT_URL=http://1.2.3.4:9000

我还发现了一个 github repository 可以为项目创建 docker 图像。他们是这样做的:

#!/bin/sh

set -e

if [ -z "$FILE_DIR" ]; then
  echo >&2 "FILE_DIR must be set"
  exit 1
fi

if [ -z "$AWS_BUCKET" ]; then
  echo >&2 "AWS_BUCKET must be set"
  exit 1
fi

mkdir -p "$FILE_DIR" && mlflow server \
    --backend-store-uri sqlite:///${FILE_DIR}/sqlite.db \
    --default-artifact-root s3://${AWS_BUCKET}/artifacts \
    --host 0.0.0.0 \
    --port $PORT

搜索这个标志和它的环境变量让我找到了相同的文档,但它没有列出它的环境变量。

除此之外,我还发现了一个 code example 可以让您在代码中设置 S3 存储桶。所以你也可以在代码中解析环境变量并像这样设置它:

import mlflow

mlfow.set_tracking_uri("your_postgres_uri")  # replace
expr_name = "new_experiment_2" # replace
s3_bucket = "your_s3_bucket_uri"  # replace

mllfow.create_experiment(expr_name, s3_bucket)
mlflow.set_experiment(expr_name)

with mlflow.start_run():
    # your code

我找到了解决方案。

我已经将 ["AWS_DEFAULT_REGION"] 添加到环境变量并且它起作用了。