1. 搭建MLOps基础环境

搭建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:

运行与验证

  1. 启动服务:在docker-compose.yml所在目录执行 docker compose up -d
  2. 验证MinIO:浏览器访问 http://localhost:9001,使用凭证 mlops_admin / mlops_secret_2024 登录,手动创建名为 mlflow-artifacts 的bucket(MLflow不会自动创建)。
  3. 验证MLflow:浏览器访问 http://localhost:5000,应显示MLflow UI首页。
  4. 端到端连通性测试:在宿主机执行以下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左侧宿主机端口映射。