포스트

MLflow 해부 (6) 운영: tracking server, 스토리지, 인증

로컬 mlruns를 넘어 PostgreSQL backend와 S3 호환 artifact store를 붙인 tracking server를 구성합니다. proxied artifact access, 인증, Docker Compose 구성과 운영 함정을 정리합니다.

MLflow 해부 (6) 운영: tracking server, 스토리지, 인증

MLflow 해부 시리즈의 6편입니다. 전체 목차는 0편에 있습니다.

원격 서버가 필요해지는 시점

로컬 mlruns/의 한계는 두 가지입니다. 다른 머신(Colab, 학습 서버)에서 돌린 실험이 로컬 폴더에 남지 않는 것, 그리고 팀원과 같은 기록을 볼 수 없는 것입니다. 이때 tracking server를 세우고 1편에서 본 두 저장소를 외부로 뺍니다.

  • backend store를 PostgreSQL로: 동시 기록에 안전하고 조회가 빠릅니다
  • artifact store를 S3 호환 스토리지로: 모델 파일이 서버 디스크가 아니라 오브젝트 스토리지에 쌓입니다
1
2
3
4
mlflow server \
  --backend-store-uri postgresql://mlflow:mlflow@localhost:5432/mlflow \
  --artifacts-destination s3://mlflow-artifacts \
  --host 0.0.0.0 --port 5001

artifact 접근의 두 방식

옵션이 두 개라서 혼동하기 쉬운 지점입니다.

  • --artifacts-destination: proxied 방식. 클라이언트가 artifact를 서버에 보내고, 서버가 스토리지에 대신 씁니다. 클라이언트에 S3 자격증명이 필요 없습니다
  • --default-artifact-root: 직접 방식. 클라이언트가 스토리지에 직접 씁니다. 모든 클라이언트에 S3 자격증명을 배포해야 합니다

특별한 이유가 없으면 proxied 방식을 권합니다. 자격증명이 서버 한 곳에만 있으면 되고, 클라이언트 설정이 MLFLOW_TRACKING_URI 하나로 끝납니다.

MinIO를 쓸 때 서버 쪽 환경변수는 다음과 같습니다.

1
2
3
export AWS_ACCESS_KEY_ID=minio
export AWS_SECRET_ACCESS_KEY=minio123
export MLFLOW_S3_ENDPOINT_URL=http://localhost:9000

Docker Compose 구성

PostgreSQL, MinIO, MLflow 서버 세 개를 묶은 최소 구성입니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
services:
  postgres:
    image: postgres:16
    environment:
      POSTGRES_USER: mlflow
      POSTGRES_PASSWORD: mlflow
      POSTGRES_DB: mlflow
    volumes: ["pgdata:/var/lib/postgresql/data"]

  minio:
    image: minio/minio
    command: server /data --console-address ":9001"
    environment:
      MINIO_ROOT_USER: minio
      MINIO_ROOT_PASSWORD: minio123
    ports: ["9000:9000", "9001:9001"]
    volumes: ["miniodata:/data"]

  mlflow:
    image: ghcr.io/mlflow/mlflow
    depends_on: [postgres, minio]
    environment:
      AWS_ACCESS_KEY_ID: minio
      AWS_SECRET_ACCESS_KEY: minio123
      MLFLOW_S3_ENDPOINT_URL: http://minio:9000
    command: >
      mlflow server
      --backend-store-uri postgresql://mlflow:mlflow@postgres:5432/mlflow
      --artifacts-destination s3://mlflow-artifacts
      --host 0.0.0.0 --port 5000
    ports: ["5001:5000"]

volumes:
  pgdata:
  miniodata:

MinIO 버킷(mlflow-artifacts)은 첫 구동 때 콘솔(9001)에서 만들어야 합니다. NYC 택시 프로젝트 6편이 이 구성을 프로젝트에 실제로 붙인 기록입니다.

인증

MLflow는 인증이 기본으로 꺼져 있습니다. 선택지는 두 층입니다.

  • MLflow basic auth: 내장 사용자 관리와 권한(experiment 단위)을 제공합니다
  • 리버스 프록시: nginx 뒤에 두고 사내 SSO나 VPN으로 접근을 제한하는 방식. 운영 환경에서는 이쪽이 일반적입니다

어느 쪽이든 인증 없이 외부 네트워크에 노출하지 않는 것이 원칙입니다. 기록에는 모델 구조와 데이터 경로 같은 내부 정보가 들어갑니다.

운영 함정

  1. 파일 backend로 병렬 실험을 돌리면 기록이 깨집니다. 증상은 run 누락과 UI 지연이고, 원인은 mlruns/ 파일 저장소의 동시 쓰기 취약성입니다. 원격 이전과 무관하게, 병렬 실험을 시작하는 시점에 SQLite로라도 DB backend로 바꿉니다
  2. 서버를 옮기면 예전 run의 artifact가 안 열립니다. run 메타데이터에 artifact 위치가 기록 시점 경로로 저장되기 때문입니다. 파일 경로 기반으로 쌓은 기록은 서버 이전 때 깨지므로, 처음부터 오브젝트 스토리지로 시작하는 것이 예방책입니다
  3. 백업 대상이 두 곳입니다. PostgreSQL만 백업하면 메타데이터는 살아도 모델 파일이 없습니다. backend store와 artifact store를 세트로 백업합니다

다음 편은 응용으로, 3.x의 tracing으로 LLM 호출을 기록합니다.

다음 글: MLflow 해부 (7) 응용: 3.x tracing으로 LLM 호출 기록

이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.