MLOps

[MLOps] 16. 모델 저장소 구축 방법 (feat. 도커 컴포즈)

mlslly 2024. 4. 30. 13:33

* 프로그래머스의 마키나락스 MLOPS 강의를 참고하여 작성함

 

앞서 기획했던 모델 저장 아키텍쳐대로, 모델 저장소를 구축해 보도록하겠다.

https://ysryuu.tistory.com/33

 

[MLOps] 15. 모델 저장 개념 및 구조

* 프로그래머스의 마키나락스 MLOPS 강의를 참고하여 작성함 모델 저장소는 학습이 완료된 모델을 저장할 수 있게 한다...

ysryuu.tistory.com

 

백앤드 스토어 구축, 아티펙트 스토어 구축 (모델 저장) -> MLflow 실행 순으로 진행할 것이며, 

 

원하는 순서대로 실행하기 위해 도커 컴포즈를 활용할 것이다.

도커 컴포즈는 도커 명령어를 한줄씩 터미널에 입력하지 않고 한 파일 내에서 코드로 관리 가능하며, 무엇보다 컨테이너의 실행 순서를 지정할 수 있다는 점이 장점이다.

 

도커 컴포즈 구성 확인 

우선 최종적으로 작성할 도커 컴포즈 파일의 구조는 아래와 같을 것이다.

(도커 컴포즈 전반에 대해서는 이전 포스팅을 참고  https://ysryuu.tistory.com/8)

 

<docker-compose.yaml 파일>

version : '3'

services: 
  mlflow-artifact-store : 
  
  mlflow-backend-store: 
  
  mlflow-server:
    build:
      context: 
      dockerfile : Dockerfile
    depends_on:
      mlflow-artifact-store:
        condition: service_healthy
      mlflow-backend-store:
        condition: service_healthy
    ports:
      - 5001:5000

 

[depends_on] : mlflow-server가 실행되기 전에 충족되어야 할, 실행되어야 할 서비스의 목록과 조건을 기재한다.

[condition : service_healthy] : MLflow가 실행되기 전에 백엔드(mlflow-backend-store)와 아티펙트 스토어(mlflow-artifact-store)가 구축 및 정상 실행되고 있어야 한다는 의미로, 두 스토어의 컨디션이 모두 condition : service_healthy 라는 조건을 만족해야지만, MLflow 서버를 실행 한다는 의미이다.

 

아티펙트 스토어 구축하기 

아티펙트 스토어는 MinIO를 사용하고, Amazon S3를 저장소로 하여 모델을 저장하기로 했었다. 

MinIO를 실행하는 도커 코드에서 일부를 가져와 도커 컴포즈에 반영해보자.

$ docker run -p 9000:9000 -p 9001:9001 \
	 -e MINIO_ROOT_USER = minio \
         -e MINIO_ROOT_PASSWORD = miniostorage \
         minio/minio \ 
         server /data/minio --console-address : 9001

 

다시 docker 코드를 간략히 설명해보자면 총 4 부분으로 구성되어 있음을 알 수 있다.

 

1. 포트 관련 (ports)

[-p 9000:9000 -p 9001:9001] : 컨테이너의 포트를 호스트에 매핑하는 포트 포워딩 코드로, host의 9000 포트를 컨테이너의 9000 포트로, 그리고 host의 9001 포트를 컨테이너의 9001 포트로 매핑한다.

 

2. 환경 관련 (environment)

[-e MINIO_ROOT_USER~]  : -e라는 환경 아규먼트 부분은, MInio에 접근할 계정 환경을 의미한다. 접근 가능한 user와 password를 정의 한다.

 

3. 도커 이미지 관련 (image)

[minio/minio] : 이 부부분은 사용할 도커 이미지의 이름이다. 여기서는 공식 MinIO 도커 이미지를 사용한다.

 

4. 컨테이너 내 명령 관련 (command)

[server /data/minio --console-address :9001]  이 부분은 컨테이너 내에서 실행할 명령어로, 이 명령어는 MinIO 서버를 /data/minio 경로에 설정하고 콘솔 주소를 포트 9001로 설정한다.

 

이 부분들을 그대로 반영하여,

도커 컴포즈 파일의 services 부분의 artifact-store 내용을

아래와 같이 ports, image, environment, command  각각의 내용을 추가해줄 수 있다. 

여기에 더해, 위에서 언급한 healthcheck 부분을 추가하여, 아티팩트 스토어가 정상적으로 실행중인지 확인하기 위한 명령어까지 함께 추가하여 도커 컴포즈 파일을 작성하겠다.

 

5. 서비스 정상실행 여부 확인 (healthcheck) 

[test] 사용할 명령어 

[interval] 정상실행 여부 확인 주기 

[timeout] 응답하지 않는 경우 대기할 시간, 이 시간이 지나면 서비스가 정상 작동하지 않는다고 판단

[retries] 재시도 횟수 

 

<docker-compose.yaml 파일 >

services: 
  ...
  
  mlflow-artifact-store:
    image: minio/minio
    ports:
      - 9000:9000
      - 9001:9001
    environment:
      MINIO_ROOT_USER: minio
      MINIO_ROOT_PASSWORD: miniostorage
    command : server /data/minio --console-address :9001
    healthcheck:
      test : ['CMD', 'curl','-f', 'http://0.0.0.0:9000/minio/health/live']
      interval : 30s
      timeout : 20s
      retries : 3
      
      ...

 

 

백앤드 스토어 구축하기

백앤드 스토어는 PostgreSQL을 구축하기로 했었다. 

PostgreSQL을 실행하는 도커 코드에서 일부를 가져와 도커 컴포즈에 반영해보자. 도커 코드는 https://www.bearpooh.com/122 참고

$ docker pull postgres:14.1 # dockerhub를 사용하는 경우, docker 이미지 받아오기
$ docker run -p 5432:5432 --name sr=postgres \
	-e POSTGRES_PASSWORD=POSTGRES_PASS -e TZ = Asia/Seoul \
    	-v datapath/pgdata:/var/lib/posgresql/data -d \ # 공유 볼륨 경로
    	postgres:14.1 # 이미지명:버전

 

이 코드 또한 

port, envirornment, image 정보 등을 포함하고 있음을 알 수 있다. 위에서처럼 healthcheck까지 포함해서 도커 컴포즈 파일을 작성해보자.

 

<docker-compose.yaml 파일 >

services : 
	...
    mlflow-backend-store: 
        image : postgres:14.0
        environment: 
          POSTGRES_USER: mlflowuser
          POSTGRES_PASSWORD: mlflowpassword
          POSTGRES_DB: mlflowdatabase
        healthcheck: 
          test: ['CMD','pg_isready','-q','-U', 'mlflowuser','-d','mlflowdatabase']
          interval: 10s
          timeout: 5s
          retries: 5
          
          ...

 

위 코드로 MLflow 서버의 백엔드 데이터베이스인 PostgreSQL을 설정한다.

 

1. 도커 이미지 설정 (image)

[image: postgres:14.0] : MLflow 백엔드 데이터베이스로 사용할 PostgreSQL의 Docker 이미지 버전을 지정하고, 여기서는 PostgreSQL 14.0 버전을 사용한다 

 

2. 환경 변수 설정 (environment) 

[POSTGRES_USER] : PostgreSQL 데이터베이스에 접속할 사용자 이름

[POSTGRES_PASSWORD] : PostgreSQL 데이터베이스에 접속할 때 사용할 비밀번호

[POSTGRES_DB] : PostgreSQL에 생성될 데이터베이스의 이름을 지정하기 

 

3. 서비스 정상실행 여부 확인 (healthcheck) 

백엔드 데이터베이스가 정상적으로 작동하는지 확인하기 위한 설정이다 

[test: ['CMD','pg_isready','-q','-U', 'mlflowuser','-d','mlflowdatabase']] : test: 건강 상태 검사를 수행하는 명령어를 지정한다.

여기서는 pg_isready 명령을 사용하여 PostgreSQL 데이터베이스가 준비되었는지 확인 후, -q 옵션으로 결과를 출력하지 않도록 하고,

user를 의미하는 -U 옵션으로 유저 아이디 mlflowuser로 접속하고, 데이터베이스를 의미하는 -d 옵션으로  mlflowdatabase 데이터베이스가 사용 가능한지 확인한다 

 

MLflow 서버 실행 

 

이제 mlflow-server 실행 부분을 작성할 차례이다.

mlflow-server 부분은 build, depends_on, ports, environment, command 총 다섯가지 부분으로 구성된다.

 

<docker-compose.yaml 파일 >

services: 
	...
	  mlflow-server:
        build:
          context: .
          dockerfile : Dockerfile
        depends_on:
          mlflow-artifact-store:
            condition: service_healthy
          mlflow-backend-store:
            condition: service_healthy
        ports:
          - 5001:5000
        environment: 
          AWS_ACCESS_KEY_ID : minio
          AWS_SECRET_ACCESS_KEY : miniostorage
          MLFLOW_S3_ENDPOINT_URL: http://mlflow-artifact-store:9000
        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://mlflowuser:mlflowpassword@mlflow-backend-store/mlflowdatabase \
            --default-artifact-root s3://mlflow/ \
            --host 0.0.0.0

 

1. 도커 이미지 빌드 설정 (build)

[context: .] 도커 파일이 위치한 디렉토리 지정

[dockerfile: Dockerfile] 사용할 도커 파일 지정

 

2. 서비스 의존성 설정 (depends_on)

MLflow 아티팩트 저장소, 백엔드 저장소 서비스에 대한 의존성을 설정함

[condition: service_healthy] : 앞서 healthcheck한 결과 해당 서비스가 healthy한 상태인 경우에만 의존성을 충족하도록함

 

3. 포트 설정 및 매핑 (ports)

[5001:5000] 호스트의 5001 포트를 컨테이너의 5000 포트로 매핑 (포트 포워딩) 

 

4. 환경 변수 설정 (environment)

artifact store와 통신할 수 있게 하는 정보로, MinIO에 엑세스하기 위한 엑세스의 키 ID, password를 지정함

[MLFLOW_S3_ENDPOINT_URL: http://mlflow-artifact-store:9000] : MLflow에서 사용할 S3 엔드포인트 URL을 설정한다. 

엔드포인트(endpoint)"는 네트워크에서 접근할 수 있는 특정한 주소나 지점을 가리킴.

이 설정은 MLflow가 데이터 및 모델의 아티펙트를 저장하기 위해 사용할 S3 호환 스토리지의 위치를 지정한다. (스토리지에 접근할 수 있는 URL) 

여기에서는 MinIO 스토리지의 주소로 : mlflow-artifact-score(컨테이너이름) 와 포트 9000을 사용하고 있음

이 URL로 MinIO의 S3와 호환하는 API를 통해 데이터를 저장 및 관리 할 수 있음  

 

5. 컨테이너가 시작될 때 실행할 명령어 (command)

[- /bin/sh] : 컨테이너 내에서 실행될 셀을 지정함[- -c] 셀에서 실행할 명령어를 지정함[-| ] : 이 다음줄부터 여러줄의 명령어를 입력할 것임을 지시[mc config host add mlflowminio] : mc는 MinIO 클라이언트를 나타낸다. mc를 사용하여, 'mlflowminio'라는 호스트를 추가한다는 의미

[http://mlflow-artifact-store:9000]

: MinIO 서버의 주소로, 이 서버는 MinIO 컨테이너인 mlflow-artifact-store를 가리킨다 [minio miniostorage &&] : minio는 MinIO 서버 로그인 시의 아이디, miniostorage는 패스워드. &&는 이전 명령이 성공적으로 실행되었을 때 다음 명령어를 실행한다는 의미[mc mb --ignore-existing mlflowminio/mlflow] : MinIO 클라이언트인 mc를 사용하여, MinIO의 버킷을 만드는데 (mb) 버킷이 이미 존재하는 경우에도 무시하고 계속 진행함 [mlflowminio/mlflow] : MinIO 서버에 만들려는 버킷의 경로를 지정한 것 

 

[mlflow server \] : mlflow 서버를 실행함 [--backend-store-uri] : mlflow 서버의 백엔드 스토어 URI를 설정함 [postgresql://mlflowuser:mlflowpassword@mlflow-backend-store/mlflowdatabase \] : 이 부분은 PostgreSQL 데이터 베이스에 대한 연결정보로, 여기서 mlflowuser는 사용자 이름, password는 패스워드, mlflow-backend-store는 PostgreSQL 호스트를 가리키는 DNS 이름 또는 IP 주소이며, mlflowdatabase는 데이터베이스 이름임

[--default-artifact-root s3://mlflow/ ] MLflow 서버의 기본 아티펙트 저장소 경로를 지정하며, 여기에서 s3://mlflow 가 모든 아티펙트의 기본 저장 위치로 설정됨 

[--host 0.0.0.0] 이는 MLflow 서버가 수신 대기할 네트워크 인터페이스를 지정하는 옵션인데, 여기에서 '0.0.0.0'으로 지정되었으므로 MLflow 서버가 모든 네트워크 인터페이스에서 요청을 수신할 수 있음. 즉 컴퓨터에 연결된 모든 네트워크 인터페이스(로컬 네트워크, 외부 네트워크 등)에서 들어오는 요청 및 접근을 허락한다는 의미

 


최종 도커 및 컴포즈 파일 작성

1. 최종 도커 컴포즈 파일

 

위에서 설명해온 아티펙트 스토어 구축 + 백엔드 스토어 구축 + ML플로우 서버 실행 내용이 모두 포함된 최종 도커 컴포즈 파일의 내용은 아래와 같다.

<docker-compose.yaml 파일 내용>

version : '3'

services: 
  mlflow-artifact-store:
    image: minio/minio
    ports:
      - 9000:9000
      - 9001:9001
    environment:
      MINIO_ROOT_USER: minio
      MINIO_ROOT_PASSWORD: miniostorage
    command : server /data/minio --console-address :9001
    healthcheck:
      test : ['CMD', 'curl','-f', 'http://0.0.0.0:9000/minio/health/live']
      interval : 30s
      timeout : 20s
      retries : 3

  mlflow-backend-store: 
    image : postgres:14.0
    environment: 
      POSTGRES_USER: mlflowuser
      POSTGRES_PASSWORD: mlflowpassword
      POSTGRES_DB: mlflowdatabase
    healthcheck: 
      test: ['CMD','pg_isready','-q','-U', 'mlflowuser','-d','mlflowdatabase']
      interval: 10s
      timeout: 5s
      retries: 5

  mlflow-server:
    build:
      context: .
      dockerfile : Dockerfile
    depends_on:
      mlflow-artifact-store:
        condition: service_healthy
      mlflow-backend-store:
        condition: service_healthy
    ports:
      - 5001:5000
    environment: 
      AWS_ACCESS_KEY_ID : minio
      AWS_SECRET_ACCESS_KEY : miniostorage
      MLFLOW_S3_ENDPOINT_URL: http://mlflow-artifact-store:9000
    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://mlflowuser:mlflowpassword@mlflow-backend-store/mlflowdatabase \
        --default-artifact-root s3://mlflow/ \
        --host 0.0.0.0

 

2. 최종 도커 파일 

 

<Dockerfile 파일 내용>

FROM amd64/python:3.12.2-slim

RUN apt-get update &7 apt-get install -y \ 
    git \
    wget \
    && rm -rf /var/lib/apt/lists/*

RUN pip install -U pip &&\
    pip install mlflow psychopg2-binary boto3

RUN cd /tmp &&\
    wget https://dl.min.io/client/mc/release/linux-amd64/mc &&\
    chmod +x mc &&\
    mv mc usr/bin/mc

CMD ["mlflow","server","--host","0.0.0.0"]

 

위 Dockerfile은 MLflow 서버를 실행하기 위한 환경을 설정하는 데 사용된다.

 

[FROM amd64/python:3.12.2-slim] : 기본 이미지를 저장하는 부분으로 Python 3.12.2 버전을 포함하는 경량화된(최소한의 기능만 포함한) Debian Linux 기반 이미지를 사용한다 

[apt-get update && apt-get install] : 패키지 목록을 업데이트 하고, 필요한 패키기를 설치한다 

[git\ gwet] : git과 gwet을 설치한다 

[rm -rf /var/lib/apt/lists/*] apt-get update 과정에서 사용된 캐시를 삭제한다 

[RUN pip install -U pip &&\ pip install mlflow psychopg2-binary boto3] : 패키지 관리자인 pip를 업그레이드하고, MLflow, psychopg2-binary, boto3 패키지를 설치함

[RUN cd /tmp &&\ wget https://dl.min.io/client/mc/release/linux-amd64/mc &&\ chmod +x mc &&\ mv mc usr/bin/mc] MinIO 의 mc 클라이언트를 다운로드 설치하며, mc는 서버와의 상호작용 도구이다 

[CMD ["mlflow","server","--host","0.0.0.0"]] : 컨테이너 시작시 실행되는 기본 명령어로 호스트를 0.0.0.0으로 설정해 모든 외부 접근을 허용함 


 

파일 실행하기 

 

도커 build 

도커 파일 및 컴포즈 파일 내용을 수정했으므로, 도커 이미지를 다시 빌드해준다 

$ docker compose up --build

 

아래와 같이 실행 성공! 우선 이미지를 빌딩하고, 

1) mlflow-artifact-store를 생성 

2) backend-store 생성

3) mlflow-server 생성했음을 확인 가능하다.

 

<실행 결과 >

[+] Building 35.8s (9/9) FINISHED                                                                                                 docker:desktop-linux
 => [mlflow-server internal] load build definition from Dockerfile                                                                                0.1s
 => => transferring dockerfile: 471B                                                                                                              0.0s
 => [mlflow-server internal] load metadata for docker.io/amd64/python:3.12.2-slim                                                                 0.8s
 => [mlflow-server internal] load .dockerignore                                                                                                   0.0s
 => => transferring context: 2B                                                                                                                   0.0s
 => [mlflow-server 1/5] FROM docker.io/amd64/python:3.12.2-slim@sha256:ac212230555ffb7ec17c214fb4cf036ced11b30b5b460994376b0725c7f6c151           0.0s
 => CACHED [mlflow-server 2/5] WORKDIR /User/yeseulryu/python-code                                                                                0.0s
 => CACHED [mlflow-server 3/5] RUN apt-get update && apt-get install -y     git     wget     && rm -rf /var/lib/apt/lists/*                       0.0s
 => CACHED [mlflow-server 4/5] RUN pip install -U pip &&    pip install mlflow psycopg2-binary boto3                                              0.0s
 => [mlflow-server 5/5] RUN cd /tmp && wget https://dl.min.io/client/mc/release/linux-amd64/mc && chmod +x mc && mv mc /usr/bin/mc               16.4s
 => [mlflow-server] exporting to image                                                                                                           18.2s
 => => exporting layers                                                                                                                          17.9s
 => => writing image sha256:7fd8551129f544651f3bf8d7814a7897f43c26a1d8ce90ca709c682a82bd8d4b                                                      0.0s 
 => => naming to docker.io/library/python-code-mlflow-server                                                                                      0.0s 
[+] Running 1/4                                                                                                                                        
 ✔ Network python-code_default                    Created                                                                                         0.3s 
 ⠋ Container python-code-mlflow-artifact-store-1  Created                                                                                         1.0s 
 ⠋ Container python-code-mlflow-backend-store-1   Created                                                                                         1.0s 
 ⠼ Container python-code-mlflow-server-1          Created                                                                                         0.5s 
Attaching to mlflow-artifact-store-1, mlflow-backend-store-1, mlflow-server-1
mlflow-backend-store-1   | The files belonging to this database system will be owned by user "postgres".
mlflow-backend-store-1   | This user must also own the server process.
mlflow-backend-store-1   | 
mlflow-backend-store-1   | The database cluster will be initialized with locale "en_US.utf8".
mlflow-backend-store-1   | The default database encoding has accordingly been set to "UTF8".
mlflow-backend-store-1   | The default text search configuration will be set to "english".
mlflow-backend-store-1   | 
mlflow-backend-store-1   | Data page checksums are disabled.
mlflow-backend-store-1   | 
mlflow-backend-store-1   | fixing permissions on existing directory /var/lib/postgresql/data ... ok
mlflow-backend-store-1   | creating subdirectories ... ok
mlflow-backend-store-1   | selecting dynamic shared memory implementation ... posix
mlflow-backend-store-1   | selecting default max_connections ... 100
mlflow-backend-store-1   | selecting default shared_buffers ... 128MB
mlflow-backend-store-1   | selecting default time zone ... Etc/UTC
mlflow-backend-store-1   | creating configuration files ... ok
mlflow-backend-store-1   | running bootstrap script ... ok
mlflow-artifact-store-1  | Formatting 1st pool, 1 set(s), 1 drives per set.
mlflow-artifact-store-1  | WARNING: Host local has more than 0 drives of set. A host failure will result in data becoming unavailable.
mlflow-artifact-store-1  | 
mlflow-artifact-store-1  |  You are running an older version of MinIO released 1 week before the latest release 
mlflow-artifact-store-1  |  Update: Run `mc admin update ALIAS` 
mlflow-artifact-store-1  | 
mlflow-artifact-store-1  | 
mlflow-artifact-store-1  | MinIO Object Storage Server
mlflow-artifact-store-1  | Copyright: 2015-2024 MinIO, Inc.
mlflow-artifact-store-1  | License: GNU AGPLv3 <https://www.gnu.org/licenses/agpl-3.0.html>
mlflow-artifact-store-1  | Version: RELEASE.2024-04-18T19-09-19Z (go1.21.9 linux/amd64)
mlflow-artifact-store-1  | 
mlflow-artifact-store-1  | API: http://172.18.0.3:9000  http://127.0.0.1:9000 
mlflow-artifact-store-1  | WebUI: http://172.18.0.3:9001 http://127.0.0.1:9001   
mlflow-artifact-store-1  | 
mlflow-artifact-store-1  | Docs: https://min.io/docs/minio/linux/index.html
mlflow-artifact-store-1  | Status:         1 Online, 0 Offline. 
mlflow-artifact-store-1  | STARTUP WARNINGS:
mlflow-artifact-store-1  | - The standard parity is set to 0. This can lead to data loss.
mlflow-backend-store-1   | performing post-bootstrap initialization ... ok
mlflow-backend-store-1   | initdb: warning: enabling "trust" authentication for local connections
mlflow-backend-store-1   | You can change this by editing pg_hba.conf or using the option -A, or
mlflow-backend-store-1   | --auth-local and --auth-host, the next time you run initdb.
mlflow-backend-store-1   | syncing data to disk ... ok
mlflow-backend-store-1   | 
mlflow-backend-store-1   | 
mlflow-backend-store-1   | Success. You can now start the database server using:
mlflow-backend-store-1   | 
mlflow-backend-store-1   |     pg_ctl -D /var/lib/postgresql/data -l logfile start
mlflow-backend-store-1   | 
mlflow-backend-store-1   | waiting for server to start....2024-04-30 04:20:37.726 UTC [48] LOG:  starting PostgreSQL 14.0 (Debian 14.0-1.pgdg110+1) on x86_64-pc-linux-gnu, compiled by gcc (Debian 10.2.1-6) 10.2.1 20210110, 64-bit
mlflow-backend-store-1   | 2024-04-30 04:20:37.730 UTC [48] LOG:  listening on Unix socket "/var/run/postgresql/.s.PGSQL.5432"
mlflow-backend-store-1   | 2024-04-30 04:20:37.761 UTC [49] LOG:  database system was shut down at 2024-04-30 04:20:36 UTC
mlflow-backend-store-1   | 2024-04-30 04:20:37.794 UTC [48] LOG:  database system is ready to accept connections
mlflow-backend-store-1   |  done
mlflow-backend-store-1   | server started
mlflow-backend-store-1   | CREATE DATABASE
mlflow-backend-store-1   | 
mlflow-backend-store-1   | 
mlflow-backend-store-1   | /usr/local/bin/docker-entrypoint.sh: ignoring /docker-entrypoint-initdb.d/*
mlflow-backend-store-1   | 
mlflow-backend-store-1   | 2024-04-30 04:20:38.528 UTC [48] LOG:  received fast shutdown request
mlflow-backend-store-1   | waiting for server to shut down....2024-04-30 04:20:38.535 UTC [48] LOG:  aborting any active transactions
mlflow-backend-store-1   | 2024-04-30 04:20:38.561 UTC [48] LOG:  background worker "logical replication launcher" (PID 55) exited with exit code 1
mlflow-backend-store-1   | 2024-04-30 04:20:38.561 UTC [50] LOG:  shutting down
mlflow-backend-store-1   | 2024-04-30 04:20:38.639 UTC [48] LOG:  database system is shut down
mlflow-backend-store-1   |  done
mlflow-backend-store-1   | server stopped
mlflow-backend-store-1   | 
mlflow-backend-store-1   | PostgreSQL init process complete; ready for start up.
mlflow-backend-store-1   | 
mlflow-backend-store-1   | 2024-04-30 04:20:38.852 UTC [1] LOG:  starting PostgreSQL 14.0 (Debian 14.0-1.pgdg110+1) on x86_64-pc-linux-gnu, compiled by gcc (Debian 10.2.1-6) 10.2.1 20210110, 64-bit
mlflow-backend-store-1   | 2024-04-30 04:20:38.853 UTC [1] LOG:  listening on IPv4 address "0.0.0.0", port 5432
mlflow-backend-store-1   | 2024-04-30 04:20:38.853 UTC [1] LOG:  listening on IPv6 address "::", port 5432
mlflow-backend-store-1   | 2024-04-30 04:20:38.876 UTC [1] LOG:  listening on Unix socket "/var/run/postgresql/.s.PGSQL.5432"
mlflow-backend-store-1   | 2024-04-30 04:20:38.904 UTC [62] LOG:  database system was shut down at 2024-04-30 04:20:38 UTC
mlflow-backend-store-1   | 2024-04-30 04:20:38.963 UTC [1] LOG:  database system is ready to accept connections
mlflow-server-1          | Added `mlflowminio` successfully.
mlflow-server-1          | Bucket created successfully `mlflowminio/mlflow`.
mlflow-server-1          | 2024/04/30 04:21:20 INFO mlflow.store.db.utils: Creating initial MLflow database tables...
mlflow-server-1          | 2024/04/30 04:21:21 INFO mlflow.store.db.utils: Updating database tables
mlflow-server-1          | INFO  [alembic.runtime.migration] Context impl PostgresqlImpl.
mlflow-server-1          | INFO  [alembic.runtime.migration] Will assume transactional DDL.
mlflow-server-1          | INFO  [alembic.runtime.migration] Running upgrade  -> 451aebb31d03, add metric step
mlflow-server-1          | INFO  [alembic.runtime.migration] Running upgrade 451aebb31d03 -> 90e64c465722, migrate user column to tags
mlflow-server-1          | INFO  [alembic.runtime.migration] Running upgrade 90e64c465722 -> 181f10493468, allow nulls for metric values
mlflow-server-1          | INFO  [alembic.runtime.migration] Running upgrade 181f10493468 -> df50e92ffc5e, Add Experiment Tags Table
mlflow-server-1          | INFO  [alembic.runtime.migration] Running upgrade df50e92ffc5e -> 7ac759974ad8, Update run tags with larger limit
mlflow-server-1          | INFO  [alembic.runtime.migration] Running upgrade 7ac759974ad8 -> 89d4b8295536, create latest metrics table
mlflow-server-1          | INFO  [89d4b8295536_create_latest_metrics_table_py] Migration complete!
mlflow-server-1          | INFO  [alembic.runtime.migration] Running upgrade 89d4b8295536 -> 2b4d017a5e9b, add model registry tables to db
mlflow-server-1          | INFO  [2b4d017a5e9b_add_model_registry_tables_to_db_py] Adding registered_models and model_versions tables to database.
mlflow-server-1          | INFO  [2b4d017a5e9b_add_model_registry_tables_to_db_py] Migration complete!
mlflow-server-1          | INFO  [alembic.runtime.migration] Running upgrade 2b4d017a5e9b -> cfd24bdc0731, Update run status constraint with killed
mlflow-server-1          | INFO  [alembic.runtime.migration] Running upgrade cfd24bdc0731 -> 0a8213491aaa, drop_duplicate_killed_constraint
mlflow-server-1          | INFO  [alembic.runtime.migration] Running upgrade 0a8213491aaa -> 728d730b5ebd, add registered model tags table
mlflow-server-1          | INFO  [alembic.runtime.migration] Running upgrade 728d730b5ebd -> 27a6a02d2cf1, add model version tags table
mlflow-server-1          | INFO  [alembic.runtime.migration] Running upgrade 27a6a02d2cf1 -> 84291f40a231, add run_link to model_version
mlflow-server-1          | INFO  [alembic.runtime.migration] Running upgrade 84291f40a231 -> a8c4a736bde6, allow nulls for run_id
mlflow-server-1          | INFO  [alembic.runtime.migration] Running upgrade a8c4a736bde6 -> 39d1c3be5f05, add_is_nan_constraint_for_metrics_tables_if_necessary
mlflow-server-1          | INFO  [alembic.runtime.migration] Running upgrade 39d1c3be5f05 -> c48cb773bb87, reset_default_value_for_is_nan_in_metrics_table_for_mysql
mlflow-server-1          | INFO  [alembic.runtime.migration] Running upgrade c48cb773bb87 -> bd07f7e963c5, create index on run_uuid
mlflow-server-1          | INFO  [alembic.runtime.migration] Running upgrade bd07f7e963c5 -> 0c779009ac13, add deleted_time field to runs table
mlflow-server-1          | INFO  [alembic.runtime.migration] Running upgrade 0c779009ac13 -> cc1f77228345, change param value length to 500
mlflow-server-1          | INFO  [alembic.runtime.migration] Running upgrade cc1f77228345 -> 97727af70f4d, Add creation_time and last_update_time to experiments table
mlflow-server-1          | INFO  [alembic.runtime.migration] Running upgrade 97727af70f4d -> 3500859a5d39, Add Model Aliases table
mlflow-server-1          | INFO  [alembic.runtime.migration] Running upgrade 3500859a5d39 -> 7f2a7d5fae7d, add datasets inputs input_tags tables
mlflow-server-1          | INFO  [alembic.runtime.migration] Running upgrade 7f2a7d5fae7d -> 2d6e25af4d3e, increase max param val length from 500 to 8000
mlflow-server-1          | INFO  [alembic.runtime.migration] Running upgrade 2d6e25af4d3e -> acf3f17fdcc7, add storage location field to model versions
mlflow-server-1          | INFO  [alembic.runtime.migration] Context impl PostgresqlImpl.
mlflow-server-1          | INFO  [alembic.runtime.migration] Will assume transactional DDL.
mlflow-server-1          | [2024-04-30 04:21:24 +0000] [31] [INFO] Starting gunicorn 21.2.0
mlflow-server-1          | [2024-04-30 04:21:24 +0000] [31] [INFO] Listening at: http://0.0.0.0:5000 (31)
mlflow-server-1          | [2024-04-30 04:21:24 +0000] [31] [INFO] Using worker: sync
mlflow-server-1          | [2024-04-30 04:21:24 +0000] [32] [INFO] Booting worker with pid: 32
mlflow-server-1          | [2024-04-30 04:21:24 +0000] [33] [INFO] Booting worker with pid: 33
mlflow-server-1          | [2024-04-30 04:21:24 +0000] [34] [INFO] Booting worker with pid: 34
mlflow-server-1          | [2024-04-30 04:21:24 +0000] [35] [INFO] Booting worker with pid: 35

 

결과적으로, http://0.0.0.0:5001/ 에 접속해보면, mlflow 서버가 실행됨을 확인할 수 있다.