모델 배포를 위해 mlflow환경을 docker를 통해 구축하고자 한다.
첫번째로 모델을 저장할 버킷에 대한 설정을 해주는데 minio라는 것을 사용하려한다.
사용 이유 첫번째는 공식문서에서 mlflow와 함께 사용하는 방법을 명시해두었기 때문이다.
내 설정에 맞게 사용하기 편하기 때문에 선택했다
https://blog.min.io/setting-up-a-development-machine-with-mlflow-and-minio/
두번째 추후 배포할 때를 고려해 AWS s3의 API와 호환되어서 추후에 변경이 용이하다.
(mlflow에서 S3를 권장하고 있는것도 한 몫함)
mlflow-artifact-store:
env_file:
- .env
image: minio/minio
container_name: mlflow-artifact-store
ports:
- 9000:9000
- 9001:9001
environment:
MINIO_ROOT_USER: "${MINIO_ROOT_USER}"
MINIO_ROOT_PASSWORD: "${MINIO_ROOT_PASSWORD}"
volumes:
- ./minio_data:/data
command: server /data --console-address :9001
healthcheck:
test: ["CMD", "mc", "ready", "local"]
interval: 5s
timeout: 5s
retries: 5
첫번째 minio를 위한 docker-compose 설정이다.
--console-address 는 뒤에 추가한 포트를 통해 접근할 수 있도록 해준다.
volumes을 통해 컨테이너를 내려도 데이터가 유지되게해준다.
(중요! minio 비밀번호가 8자리 이하이면 오류가 나니 8자 이상으로 설정해주세요)
그리고 훈련과정에서 생기는 loss 값이나 하이퍼파라미터와 같은 메타데이터를 저장할 데이터 베이스를 설정한다.
mlflow-backend-store:
env_file:
- .env
image: postgres:14.0
container_name: mlflow-backend-store
environment:
POSTGRES_USER: "${MLFLOW_USER}"
POSTGRES_PASSWORD: "${MLFLOW_PASSWORD}"
POSTGRES_DB: "${MLFLOW_DB}"
volumes:
- ./db_data:/var/lib/postgresql/data/
healthcheck:
test: ["CMD", "pg_isready", "-q", "-U", "mlflowuser", "-d", "mlflowdatabase"]
interval: 10s
timeout: 5s
retries: 5
이전에 작성했던 글과 설정을 같다.
https://lively-here.tistory.com/9
Docker에 데이터베이스 서버 생성하기
AI hub 여행로그 데이터를 이용해 추천 서비스를 만들려고 한다. docker run -d \ --name postgres-server \ -p 5432:5432 \ -e POSTGRES_USER=myuser \ -e POSTGRES_PASSWORD=1234 \ -e POSTGRES_DB=travel_log \ postgre
lively-here.tistory.com
다음은 mlflow 서버 를 위한 docker-compose 설정과 빌드할때 필요한 Dockerfile을 작성한다.
FROM amd64/python:3.9-slim
RUN apt-get update && apt-get install -y \
git \
wget \
&& rm -rf /var/lib/apt/lists/*
RUN pip install -U pip &&\
pip install mlflow psycopg2-binary boto3
RUN cd /tmp && \
wget https://dl.min.io/client/mc/release/linux-amd64/mc && \
chmod +x mc && \
mv mc /usr/bin/mc
mlflow 패키지와 데이터 베이스 접근에 필요한 psycopg2 와 s3 접근에 필요한 boto3를 설치하고
minio를 wget을 통해 설치한다.
mlflow-server:
build:
context: .
dockerfile: Dockerfile
container_name: mlflow-server
depends_on:
mlflow-backend-store:
condition: service_healthy
mlflow-artifact-store:
condition: service_healthy
ports:
- 5001:5000
environment:
AWS_ACCESS_KEY_ID: "${AWS_ACCESS_KEY_ID}"
AWS_SECRET_ACCESS_KEY: "${AWS_SECRET_ACCESS_KEY}"
MLFLOW_S3_ENDPOINT_URL: "${MLFLOW_S3_ENDPOINT_URL}"
command:
- /bin/sh
- -c
- |
mc config host add mlflowminio http://mlflow-artifact-store:9000 minio miniostorage &&
mc mb --ignore-existing mlflowminio/mlflow
mlflow server \
--backend-store-uri postgresql://${MLFLOW_USER}:${MLFLOW_PASSWORD}@mlflow-backend-store/mlflowdatabase \
--default-artifact-root s3://mlflow/ \
--host 0.0.0.0
백엔드 서버와 minio가 모두 실행된것을 확인하고
호스트에 mlflowminio를 등록한다.
백엔드의 DB와 연결하고 mlflow라는 이름의 버킷과 연결한다.
services:
mlflow-backend-store:
env_file:
- .env
image: postgres:14.0
container_name: mlflow-backend-store
environment:
POSTGRES_USER: "${MLFLOW_USER}"
POSTGRES_PASSWORD: "${MLFLOW_PASSWORD}"
POSTGRES_DB: "${MLFLOW_DB}"
volumes:
- ./db_data:/var/lib/postgresql/data/
healthcheck:
test: ["CMD", "pg_isready", "-q", "-U", "mlflowuser", "-d", "mlflowdatabase"]
interval: 10s
timeout: 5s
retries: 5
mlflow-artifact-store:
env_file:
- .env
image: minio/minio
container_name: mlflow-artifact-store
ports:
- 9000:9000
- 9001:9001
environment:
MINIO_ROOT_USER: "${MINIO_ROOT_USER}"
MINIO_ROOT_PASSWORD: "${MINIO_ROOT_PASSWORD}"
volumes:
- ./minio_data:/data
command: server /data/minio --console-address :9001
healthcheck:
test: ["CMD", "mc", "ready", "local"]
interval: 5s
timeout: 5s
retries: 5
mlflow-server:
build:
context: .
dockerfile: Dockerfile
container_name: mlflow-server
depends_on:
mlflow-backend-store:
condition: service_healthy
mlflow-artifact-store:
condition: service_healthy
ports:
- 5001:5000
environment:
AWS_ACCESS_KEY_ID: "${AWS_ACCESS_KEY_ID}"
AWS_SECRET_ACCESS_KEY: "${AWS_SECRET_ACCESS_KEY}"
MLFLOW_S3_ENDPOINT_URL: "${MLFLOW_S3_ENDPOINT_URL}"
command:
- /bin/sh
- -c
- |
mc config host add mlflowminio http://mlflow-artifact-store:9000 minio miniostorage &&
mc mb --ignore-existing mlflowminio/mlflow
mlflow server \
--backend-store-uri postgresql://${MLFLOW_USER}:${MLFLOW_PASSWORD}@mlflow-backend-store/mlflowdatabase \
--default-artifact-root s3://mlflow/ \
--host 0.0.0.0
volumes:
minio_data:
db_data:
전체 docker-compose 코드이다.
http://localhost:5001/
접속하면
이렇게 나온다
이미 한번 모델을 올렸기 때문에 데이터가 존재합니다
http://localhost:9001/
접속하고 docker-compose에 설정한 아이디와 비밀번호로 로그인하면 아래처럼 나옵니다.
보시는 것처럼 모델에 대한 하이퍼 파라미터와 정보가 업로드 됩니다.
'공부 > MLOps' 카테고리의 다른 글
Docker로 생성한 데이터 베이스에 자동으로 데이터를 입력하는 과정 구성하기 (0) | 2024.07.02 |
---|---|
Docker에 데이터베이스 서버 생성하기 (0) | 2024.06.29 |
Docker 설치 하기 (0) | 2024.06.29 |
MLops? (0) | 2024.06.26 |