オンプレGPU環境でmlfowのサーバを立てる
はじめに
機械学習モデルを複数で開発するときがあるとおもいます。 しかしデフォルトだと、各ユーザのフォルダにmlrunsフォルダが作成されており、自分で実行した分しか見られません。
そこでdocker-compose
を使ってMLFlow Tracking Serverを立てて、param, metric, artifactを保存する方法を見つけたので共有します。
mlflowの使い方については以下記事へ。
立て方
qiita.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で抜けて完了です。