クラウドエンジニアのノート

情報技術系全般,自分用メモを公開してます。

オンプレGPU環境でmlfowのサーバを立てる

はじめに

機械学習モデルを複数で開発するときがあるとおもいます。 しかしデフォルトだと、各ユーザのフォルダにmlrunsフォルダが作成されており、自分で実行した分しか見られません。

そこでdocker-composeを使ってMLFlow Tracking Serverを立てて、param, metric, artifactを保存する方法を見つけたので共有します。

mlflowの使い方については以下記事へ。

tmyoda.hatenablog.com

立て方

qiita.com 上記事を丸コピしたリポジトリを作成したので、そちらをクローンします。

github.com

以下を実行するとサーバが立ち上がります。

docker-compose up -d

次にpythonコードに以下のMLFlowの設定を入れ込み、リモートサーバにログを置くように設定します。

# IP address of the server where the docker-compose is running.
SERVER_IP = "192.168..."

# Set the tracking uri.
mlflow.set_tracking_uri(f"http://{SERVER_IP}:5000")

# Specify the information to the environment variable.
os.environ["MLFLOW_S3_ENDPOINT_URL"] = f"http://{SERVER_IP}:9000"
os.environ["AWS_ACCESS_KEY_ID"] = "minio-access-key"
os.environ["AWS_SECRET_ACCESS_KEY"] = "minio-secret-key"

すると、docker-composeが立ち上がっているサーバにログが保存されます。

たったこれをするだけで、保存先がリモートになってくれます! ちなみに、いつものWebのUIにアクセスするにはhttp://{SERVER_IP}:5000にブラウザでアクセスすれば見ることができます。

また、docker-compose.yamlを見れば分かる通り、セキュリティがガバガバなので、必ずローカル内で使用し、適宜パスワード等は変更してください。

guiで削除したrunsを完全削除したい

mlflowの良くないところなのですが、guiで削除してもローカルに実体は残っています。 なのでそれをきれいにするコマンドを以下に示します。

方法としては、mlflowコンテナにアタッチして、mlflow gcコマンドを使用します。

まずdocker psコマンドで対象のコンテナを探します。

docker ps

CONTAINER ID   IMAGE         COMMAND                  CREATED       STATUS          PORTS                    NAMES
9b1c5e666fe5   mlflow        "mlflow server --bac…"   2 weeks ago   Up 11 minutes   0.0.0.0:5000->5000/tcp   mlflow_server_mlflow_1
d35dfccd36f9   mysql:5.7     "docker-entrypoint.s…"   2 weeks ago   Up 2 weeks      3306/tcp, 33060/tcp      mlflow_server_mysql_1
9609eb4519d5   minio/minio   "/usr/bin/docker-ent…"   2 weeks ago   Up 2 weeks      0.0.0.0:9000->9000/tcp   mlflow_server_minio_1

この場合、9b1c5e666fe5が対象のコンテナです。

次に以下のコマンドでローカルから実体を完全削除します。

docker exec -it 9b1c5e666fe5 /bin/bash
mlflow gc --backend-store-uri 'mysql://mlflowuser:mlflowpassword@mysql:3306/mlflowdb'

最後にCtrl + p をおしてからCtrl + qで抜けて完了です。