MLflow는 전체 기계 학습 수명주기를 관리하도록 설계된 오픈 소스 플랫폼입니다. Databricks는 자체 기계 학습 개발 및 배포 프로세스에서 직면한 문제를 해결하기 위해 내부 프로젝트로 이를 만들었습니다. MLflow는 나중에 2018년 6월에 오픈 소스 프로젝트로 출시되었습니다.
전체 수명 주기를 관리하기 위한 도구로서 MLflow에는 다음 구성 요소가 포함되어 있습니다.
엔지니어가 프로덕션 설치를 망칠 염려 없이 마음껏 실험할 수 있도록 이러한 모든 기능을 개발 시스템에 설치할 수 있습니다.
MLflow를 설치하고 설정하는 데 사용되는 모든 파일은 Github 저장소 에서 찾을 수 있습니다.
MLFlow 문서에는 MLFlow 설치 옵션이 6개 이상 나열되어 있습니다. 이는 과도한 것처럼 보일 수 있지만 이러한 옵션은 데이터베이스에 대한 다양한 선호도와 다양한 수준의 네트워크 복잡성을 수용합니다.
대규모 데이터 세트를 사용하고 자체적으로 상당히 커질 수 있는 모델을 구축하는 여러 팀이 있는 조직에 가장 적합한 옵션은 다음과 같습니다. 이 옵션을 사용하려면 추적 서버, PostgreSQL 데이터베이스, S3 개체 저장소 등 세 가지 서버를 설정해야 하며, 구현에서는 MinIO를 사용합니다.
추적 서버는 MLflow 기능에 액세스하기 위한 엔지니어 개발 시스템의 단일 진입점입니다. (이름에 속지 마십시오. 위에 나열된 모든 구성 요소(추적, 모델, 프로젝트 및 리포지토리)가 포함되어 있습니다.) 추적 서버는 PostgreSQL을 사용하여 엔터티를 저장합니다. 엔터티는 실행, 매개변수, 지표, 태그, 메모 및 메타데이터입니다. (나중에 실행에 대한 자세한 내용.) 우리 구현의 추적 서버는 MinIO에 액세스하여 아티팩트를 저장합니다. 아티팩트의 예로는 모델, 데이터 세트 및 구성 파일이 있습니다.
요즘 엔지니어가 사용할 수 있는 최신 도구의 좋은 점은 컨테이너를 사용하여 도구 선택 및 네트워크 연결을 포함한 프로덕션 환경을 에뮬레이트할 수 있다는 것입니다. 이번 포스팅에서 보여드릴 내용은 바로 이것입니다. Docker Compose를 사용하여 위에서 설명한 서버를 컨테이너에서 실행되는 서비스로 설치하는 방법을 보여 드리겠습니다. 또한 원하는 경우 기존 MinIO 인스턴스를 사용할 수 있도록 MLflow 구성이 설정됩니다. 이 게시물에서는 새로운 MinIO 인스턴스를 배포하는 방법을 보여드리겠습니다. 하지만 Github 저장소 의 파일에는 기존 MinIO 인스턴스에 연결하는 방법을 보여주는 `docker-compose` 파일이 있습니다.
아래에는 설치해야 하는 모든 항목의 목록이 나와 있습니다. 이 목록에는 컨테이너(MinIO, Postgres 및 MLFlow)에서 서비스가 될 서버와 필요한 SDK(MinIO 및 MLflow)가 포함되어 있습니다.
도커 데스크탑
Docker Compose를 통한 MLFlow 추적 서버
Docker Compose를 통한 MinIO 서버
Docker Compose를 통한 PostgresSQL
pip 설치를 통한 MLFlow SDK
pip 설치를 통한 MinIO SDK
Docker Compose 서비스의 호스트 역할을 할 Docker Desktop부터 시작해 보겠습니다.
Docker 사이트에서 운영 체제에 적합한 설치를 찾을 수 있습니다. Mac에 Docker Desktop을 설치하는 경우 Mac에서 사용하는 칩(Apple 또는 Intel)을 알아야 합니다. Mac의 왼쪽 상단에 있는 Apple 아이콘을 클릭하고 "이 Mac 정보" 메뉴 옵션을 클릭하면 이를 확인할 수 있습니다.
이제 서비스를 설치할 준비가 되었습니다.
MLFLow 추적 서버, PostgresSQL 및 MinIO는 아래 표시된 Docker Compose 파일을 사용하여 서비스로 설치됩니다.
version: "3.3" services: db: restart: always image: postgres container_name: mlflow_db expose: - "${PG_PORT}" networks: - backend environment: - POSTGRES_USER=${PG_USER} - POSTGRES_PASSWORD=${PG_PASSWORD} - POSTGRES_DATABASE=${PG_DATABASE} volumes: - ./db_data:/var/lib/postgresql/data/ healthcheck: test: ["CMD", "pg_isready", "-p", "${PG_PORT}", "-U", "${PG_USER}"] interval: 5s timeout: 5s retries: 3 s3: restart: always image: minio/minio container_name: mlflow_minio volumes: - ./minio_data:/data ports: - "${MINIO_PORT}:9000" - "${MINIO_CONSOLE_PORT}:9001" networks: - frontend - backend environment: - MINIO_ROOT_USER=${MINIO_ROOT_USER} - MINIO_ROOT_PASSWORD=${MINIO_ROOT_PASSWORD} - MINIO_ADDRESS=${MINIO_ADDRESS} - MINIO_PORT=${MINIO_PORT} - MINIO_STORAGE_USE_HTTPS=${MINIO_STORAGE_USE_HTTPS} - MINIO_CONSOLE_ADDRESS=${MINIO_CONSOLE_ADDRESS} command: server /data healthcheck: test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"] interval: 30s timeout: 20s retries: 3 tracking_server: restart: always build: ./mlflow image: mlflow_server container_name: mlflow_server depends_on: - db ports: - "${MLFLOW_PORT}:5000" networks: - frontend - backend environment: - AWS_ACCESS_KEY_ID=${MINIO_ACCESS_KEY} - AWS_SECRET_ACCESS_KEY=${MINIO_SECRET_ACCESS_KEY} - MLFLOW_S3_ENDPOINT_URL=http://s3:${MINIO_PORT} - MLFLOW_S3_IGNORE_TLS=true command: > mlflow server --backend-store-uri postgresql://${PG_USER}:${PG_PASSWORD}@db:${PG_PORT}/${PG_DATABASE} --host 0.0.0.0 --serve-artifacts --artifacts-destination s3://${MLFLOW_BUCKET_NAME} healthcheck: test: ["CMD", "curl", "-f", "http://localhost:${MLFLOW_PORT}/"] interval: 30s timeout: 10s retries: 3 volumes: db_data: minio_data: networks: frontend: driver: bridge backend: driver: bridge
문제가 발생할 경우 문제를 해결하는 데 도움이 되는 몇 가지 주목할 만한 사항이 있습니다. 첫째, MinIO와 PostgreSQL은 모두 로컬 파일 시스템을 사용하여 데이터를 저장합니다. PostgreSQL의 경우 'db_data' 폴더이고 MinIO의 경우 'minio_data' 폴더입니다. 새로 설치하여 다시 시작하려면 이 폴더를 삭제하세요.
다음으로, 이 Docker Compose 파일은 구성 기반입니다. 예를 들어 PostgreSQL 데이터베이스 이름을 'mlflow'로 하드 코딩하는 대신 Docker Compose 파일의 '${PG_DATABASE}' 구문을 사용하여 아래 표시된 'config.env' 파일에서 이름을 가져옵니다.
# Postgres configuration PG_USER=mlflow PG_PASSWORD=mlflow PG_DATABASE=mlflow PG_PORT=5432 # MLflow configuration MLFLOW_PORT=5000 MLFLOW_BUCKET_NAME=mlflow # MinIO access keys - these are needed by MLflow MINIO_ACCESS_KEY=XeAMQQjZY2pTcXWfxh4H MINIO_SECRET_ACCESS_KEY=wyJ30G38aC2UcyaFjVj2dmXs1bITYkJBcx0FtljZ # MinIO configuration MINIO_ROOT_USER: 'minio_user' MINIO_ROOT_PASSWORD: 'minio_pwd' MINIO_ADDRESS: ':9000' MINIO_STORAGE_USE_HTTPS: False MINIO_CONSOLE_ADDRESS: ':9001' MINIO_PORT=9000 MINIO_CONSOLE_PORT=9001
이러한 서비스에 필요한 모든 환경 변수는 이 파일에 설정됩니다. 이 구성 파일에는 이러한 서비스가 서로 통신하는 데 필요한 정보도 포함되어 있습니다. MLFlow 추적 서버에 MinIO에 액세스하는 방법을 알리는 것은 환경 변수를 사용하는 것입니다. 즉, URL(포트 번호 포함), 액세스 키, 비밀 액세스 키, 버킷입니다. 이는 Docker Compose 사용에 대한 마지막이자 가장 중요한 점으로 이어집니다. 이러한 서비스를 처음 시작하면 먼저 MinIO UI로 이동하여 키를 가져와 버킷을 생성해야 하기 때문에 MLflow 추적 서비스가 작동하지 않습니다. 추적 서비스가 아티팩트를 저장하는 데 사용하는 것입니다.
지금 해보자. 아래 명령을 사용하여 처음으로 서비스를 시작하십시오.
docker-compose --env-file config.env up -d --build
Docker Compose 파일이 있는 동일한 디렉터리에서 이 명령을 실행해야 합니다.
이제 MinIO UI를 사용하여 키를 가져오고 버킷을 생성할 수 있습니다.
브라우저에서 `localhost:9001`로 이동합니다. `docker-compose` 파일에서 MinIO 콘솔 주소에 대해 다른 포트를 지정한 경우 대신 해당 포트를 사용하십시오. `config.env` 파일에 지정된 루트 사용자와 비밀번호를 사용하여 로그인합니다.
로그인한 후 액세스 키 탭으로 이동하여 액세스 키 생성 버튼을 클릭하세요.
그러면 액세스 키 생성 페이지로 이동됩니다.
액세스 키와 비밀 키는 생성 버튼을 클릭할 때까지 저장되지 않습니다. 이 작업이 완료될 때까지 이 페이지에서 벗어나지 마세요. 이 화면에서 키를 복사하는 것에 대해 걱정하지 마세요. 생성 버튼을 클릭하면 키를 파일 시스템(JSON 파일)에 다운로드할 수 있는 옵션이 제공됩니다. MinIO SDK를 사용하여 원시 데이터를 관리하려면 이 페이지에 있는 동안 다른 액세스 키와 비밀 키를 생성하세요.
다음으로 'mlflow'라는 버킷을 만듭니다. 이는 간단합니다. 버킷 탭으로 이동하여 '버킷 생성' 버튼을 클릭하세요.
키가 있고 버킷이 생성되면 컨테이너를 중지하고 `config.env`를 업데이트한 다음 컨테이너를 다시 시작하여 서비스 설정을 완료할 수 있습니다. 아래 명령은 컨테이너를 중지하고 제거합니다.
docker-compose down
재시작하기 위해:
docker-compose --env-file config.env up -d --build
다음으로 MLflow UI를 시작하고 모든 것이 작동하는지 확인하겠습니다.
`localhost:5000`으로 이동합니다. MLflow UI가 표시되어야 합니다.
시간을 내어 모든 탭을 살펴보세요. MLflow를 처음 사용하는 경우 실행 및 실험의 개념을 숙지하세요.
MLflow Python 패키지는 간단한 'pip' 설치입니다. Python 가상 환경에 설치하는 것이 좋습니다.
pip install mlflow
MLflow 라이브러리를 나열하여 설치를 다시 확인하세요.
pip list | grep mlflow
아래 라이브러리를 확인해야 합니다.
mlflow 2.5.0
MLflow 기능을 활용하기 위해 MinIO에 직접 액세스할 필요는 없습니다. MLflow SDK는 위에서 설정한 MinIO 인스턴스와 인터페이스합니다. 그러나 데이터가 MLflow에 제공되기 전에 데이터를 관리하기 위해 이 MinIO 인스턴스와 직접 인터페이스할 수 있습니다. MinIO는 모든 종류의 구조화되지 않은 데이터를 저장하는 좋은 방법입니다. MinIO는 기본 하드웨어를 최대한 활용하므로 규모나 성능 에 대한 걱정 없이 필요한 모든 원시 데이터를 저장할 수 있습니다. MinIO에는 여러 위치의 데이터를 동기화된 상태로 유지하는 버킷 복제 기능이 포함되어 있습니다. 또한 언젠가는 AI가 규제될 것입니다. 그날이 오면 미사용 데이터를 보호하고 규제 기관에서 요청할 수 있는 항목을 실수로 삭제하지 않도록 MinIO의 엔터프라이즈 기능( 객체 잠금 , 버전 관리 , 암호화 및 법적 잠금 )이 필요합니다.
MLflow Python 패키지를 가상 환경에 설치한 경우 동일한 환경에 MinIO를 설치합니다.
pip install minio
설치를 다시 확인하세요.
pip list | grep minio
그러면 Minio 라이브러리가 설치되었는지 확인하고 사용 중인 버전이 표시됩니다.
minio 7.1.15
이 게시물에서는 개발 머신에서 MLflow 및 MinIO를 설정하기 위한 따라하기 쉬운 레시피를 제공했습니다. 목표는 MLflow 서버 및 docker-compose 구성을 조사하는 데 드는 시간과 노력을 절약하는 것이었습니다.
이 레시피를 정확하게 유지하기 위해 모든 노력을 기울였습니다. 문제가 발생하면 [email protected] 로 연락하거나 일반 Slack 채널 토론에 참여하여 알려주시기 바랍니다.
MLflow 및 MinIO를 사용하여 모델 코딩 및 학습을 시작할 준비가 되었습니다.
여기에도 게시되었습니다.