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"]
添加到环境变量并且它起作用了。
我正在尝试使用 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"]
添加到环境变量并且它起作用了。