MLflow は、機械学習のライフサイクル全体を管理するために設計されたオープンソース プラットフォームです。 Databricks は、自社の機械学習の開発および展開プロセスで直面する課題に対処するための内部プロジェクトとしてこれを作成しました。 MLflow はその後、2018 年 6 月にオープンソース プロジェクトとしてリリースされました。
ライフサイクル全体を管理するツールとして、MLflow には次のコンポーネントが含まれています。
これらすべての機能を開発マシンにインストールできるため、エンジニアは運用環境のインストールを台無しにすることを心配することなく、思う存分実験できます。
MLflow のインストールとセットアップに使用されるすべてのファイルは、 Github リポジトリにあります。
MLFlow のドキュメントには、 MLFlow をインストールするための 6 つ以上のオプションがリストされています。これはやりすぎのように思えるかもしれませんが、これらのオプションは、データベースのさまざまな設定やさまざまなレベルのネットワークの複雑さに対応します。
大規模なデータセットを使用し、それ自体が非常に大きくなる可能性のあるモデルを構築する複数のチームがいる組織に最適なオプションを以下に示します。このオプションでは、トラッキング サーバー、PostgreSQL データベース、S3 オブジェクト ストアの 3 つのサーバーのセットアップが必要です。実装では MinIO を使用します。
Tracking Server は、エンジニアの開発マシンから MLflow 機能にアクセスするための単一のエントリ ポイントです。 (その名前に騙されないでください。これには、上記にリストしたすべてのコンポーネント (トラッキング、モデル、プロジェクト、リポジトリ) が含まれています。) トラッキング サーバーは、PostgreSQL を使用してエンティティを保存します。エンティティは、実行、パラメータ、メトリクス、タグ、メモ、メタデータです。 (詳細については後ほど説明します。) 私たちの実装における追跡サーバーは、MinIO にアクセスしてアーティファクトを保存します。アーティファクトの例としては、モデル、データセット、構成ファイルなどがあります。
最近エンジニアが利用できる最新のツールの優れている点は、コンテナを使用して、ツールの選択やネットワーク接続を含む運用環境をエミュレートできることです。それがこの投稿で説明することです。 Docker Compose を使用して、上記のサーバーをコンテナー内で実行されるサービスとしてインストールする方法を説明します。さらに、MLflow の構成は、必要に応じて MinIO の既存のインスタンスを使用できるように設定されています。この投稿では、MinIO の新しいインスタンスをデプロイする方法を説明しますが、 Github リポジトリ内のファイルには、MinIO の既存のインスタンスに接続する方法を示す `docker-compose` ファイルが含まれています。
以下は、インストールする必要があるすべてのリストです。このリストには、コンテナー内のサービスとなるサーバー (MinIO、Postgres、および MLFlow) と、必要な SDK (MinIO および MLflow) が含まれています。
Dockerデスクトップ
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 Tracking Server、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 Tracking サーバーに MinIO へのアクセス方法を通知するのは環境変数の使用であることに注意してください。つまり、URL (ポート番号を含む)、アクセス キー、シークレット アクセス キー、およびバケットです。ここから、Docker Compose の使用に関する最後の最も重要な点につながります。これらのサービスを初めて起動するときは、まず MinIO UI に移動し、キーを取得し、バケットを作成する必要があるため、MLflow Tracking サービスは機能しません。追跡サービスがアーティファクトを保存するために使用するもの。
さあ、これをやってみましょう。以下のコマンドを使用してサービスを初めて開始します。
docker-compose --env-file config.env up -d --build
このコマンドは、Docker Compose ファイルと同じディレクトリで実行してください。
これで、キーを取得し、MinIO UI を使用してバケットを作成できるようになりました。
ブラウザから「localhost:9001」に移動します。 「docker-compose」ファイルで MinIO コンソール アドレスに別のポートを指定した場合は、代わりにそのポートを使用してください。 「config.env」ファイルで指定された root ユーザーとパスワードを使用してサインインします。
サインインしたら、「アクセス キー」タブに移動し、「アクセス キーの作成」ボタンをクリックします。
これにより、「アクセス キーの作成」ページが表示されます。
アクセス キーと秘密キーは、[作成] ボタンをクリックするまで保存されません。これが完了するまで、このページから移動しないでください。この画面からキーをコピーすることを心配する必要はありません。 [作成] ボタンをクリックすると、キーをファイル システム (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 を使用してモデルのコーディングとトレーニングを開始する準備ができました。
ここでも公開されています。