1. 搭建本地MLOps实验环境
任务目标
在本案例中,你将完成一个可复现的MLOps基础环境搭建:使用Docker Compose一次性启动MLflow Tracking Server(实验跟踪)与MinIO(S3兼容对象存储,作为MLflow的artifact存储后端)。完成后,你拥有一个本地可运行的实验跟踪平台,能够记录模型训练的指标、参数与产物文件。
环境依赖
- Linux/macOS/Windows(启用WSL2)
- Docker Engine 20.10+ 与 Docker Compose v2
- 宿主机空闲端口:5000(MLflow UI)、9000(MinIO API)、9001(MinIO控制台)
实现方案
采用最小化双服务架构:MinIO存储artifact,MLflow连接MinIO并跟踪实验元数据。通过共享Docker网络实现服务间通信,使用预签名URL方式访问对象存储。
关键完整代码
# docker-compose.yml
services:
minio:
image: minio/minio:RELEASE.2024-01-16T16-07-38Z
container_name: mlops-minio
command: server /data --console-address ":9001"
environment:
MINIO_ROOT_USER: mlops_admin
MINIO_ROOT_PASSWORD: mlops_secret_2024
ports:
- "9000:9000"
- "9001:9001"
volumes:
- minio_data:/data
healthcheck:
test: ["CMD", "mc", "ready", "local"]
interval: 5s
timeout: 5s
retries: 5
mlflow:
image: ghcr.io/mlflow/mlflow:v2.9.2
container_name: mlflow-server
depends_on:
minio:
condition: service_healthy
environment:
MLFLOW_S3_ENDPOINT_URL: http://minio:9000
AWS_ACCESS_KEY_ID: mlops_admin
AWS_SECRET_ACCESS_KEY: mlops_secret_2024
command: >
mlflow server
--backend-store-uri sqlite:////mlflow/mlflow.db
--default-artifact-root s3://mlflow-artifacts/
--host 0.0.0.0
--port 5000
ports:
- "5000:5000"
volumes:
- mlflow_db:/mlflow
volumes:
minio_data:
mlflow_db:
运行与验证
- 启动服务:在docker-compose.yml所在目录执行
docker compose up -d - 验证MinIO:浏览器访问
http://localhost:9001,使用凭证mlops_admin / mlops_secret_2024登录,手动创建名为mlflow-artifacts的bucket(MLflow不会自动创建)。 - 验证MLflow:浏览器访问
http://localhost:5000,应显示MLflow UI首页。 - 端到端连通性测试:在宿主机执行以下Python脚本(需已安装
mlflow与boto3):
import mlflow
mlflow.set_tracking_uri("http://localhost:5000")
mlflow.set_experiment("env_validation")
with mlflow.start_run():
mlflow.log_metric("connectivity", 1.0)
mlflow.log_param("storage", "minio")
# 写入一个artifact验证S3连通性
with open("test.txt", "w") as f:
f.write("MLOps artifact check")
mlflow.log_artifact("test.txt")
print("验证完成,请检查MLflow UI中是否存在该run及其artifact")
通过标准:MLflow UI中出现名为 env_validation 的实验,且该run下存在 test.txt 文件;点击该文件可预览内容,说明MLflow与MinIO的artifact链路完全打通。
常见问题
- MinIO健康检查失败:确认镜像版本标签正确,旧版本可能缺少
mc命令。 - artifact上传报403:检查bucket名称是否与
--default-artifact-root中一致,且bucket已手动创建。 - 端口冲突:若5000/9000/9001被占用,修改docker-compose.yml左侧宿主机端口映射。