Re:ゼロから始めるML生活

どちらかといえばエミリア派です

ローカル環境のmlflowの記録をGCPに残す

f:id:nogawanogawa:20200329110122p:plain:w500

前回までこんなことやってました。

www.nogawanogawa.com

www.nogawanogawa.com

mlflowの使い方がだんだん分かってきたので、実験の結果をgcp上に保存してみたいと思います。 参考にさせていただいたのはこちらの記事です。

towardsdatascience.com

それではやってみます。

モチベーション

mlflowは実験管理として非常に有効だと思っています。 ただ、いろんな環境で実験を行う場合に実験の結果が散在してしまうと、結局実験の管理ができていないことになってしまいます。 どの環境でmlflowを使って実験を記録したとしてもその結果は同一の保存先になっていることが望まれます。 そうすることで、実験を本当の意味で一元管理でき、どこで実験を行っても素早く正しく実験結果を参照する事ができるようにしたいと思います。

クラウドの設定

プロジェクト/IAM

わかりやすくするためにプロジェクトを切ってしまいました。

cloud.google.com

この辺を参考にします。

作成したら、まずはIAMの権限の設定と、認証キー(json)を作成します。 左のメニューバーから、

IAMと管理
→サービスアカウント
→サービスアカウントを作成

権限は、もとの記事に習って

  • Cloud SQL (編集者)
  • Storage Object (管理者)

を付与して、jsonキーを作成、ダウンロードしておきます。

Cloud SQL

MLFlowのメトリクス/パラメータ情報についてはRDBに保存していくことができます。 今回はPostgresインスタンスを使用します。 正直、直接DBを触ることはないのでなんでもいいんですが。

2020/4/4時点で、postgres SQLは11まで対応(12はベータ版提供)しており、11を使用しました。 リージョン等は好みに合わせて近いところを選択して頂いて、接続のタブに行きます。

今回、外部から直接DBを触るので、接続の設定で、

パブリックIP
→ネットワークを追加

で、0.0.0.0/0を追加します。 これでパブリックからアクセス可能になります。(ユーザー名とパスワードがあれば誰でもアクセスできる設定)

その他、バックアップの設定等は好みで設定します。 作成したら、接続可能なアカウントのパスワードを確認して起きます。 (デフォルトで"postgres"ユーザーが使えるので、今回はそのパスワードを控えておきました。)

これでDB側の設定は完了です。

Cloud Storage

学習による作成物(artifact)を保存するバケットを設定します。 コンソールの左のメニューから

ストレージ
→バケットを作成

を選択して、バケットを作成します。 作成したバケットに関して、先ほどのIAMの権限に追加で

  • "Legacy Bucket Owner”
  • “Legacy Bucker Reader”

を付与します。 これで、認証用のJSONを持っていればバケットにアクセスできる様になります。

ローカルの設定

mlflow サーバー

GCSとPostgresに接続するライブラリと、mlflowを準備します。

$ pip install google-cloud-storage mlflow psycopg2-binary

上でダウンロードした認証用JSONにパスを設定します。

$ export GOOGLE_APPLICATION_CREDENTIALS=”path/to/jsonfile”

サーバーを起動します。

mlflow server --backend-store-uri 'postgresql://<username>:<password>@<sql ip>/<DB名>' --default-artifact-root gs://<バケット名>

<>で囲った部分について、設定値を入れてサーバーを起動すると、postgresの初期化が行われます。

これで準備は完了です。

やってみる

こちらのコードで実験してみると、ちゃんとメトリクス・artifact共にクラウドに保存されていました。

運用としては、実験の結果を参照する際に、ローカルのmlflowサーバーを上の手順で起動して、そちらにアクセスするという形ができるようになります。

今回のオチ

本当は、クラウドですべての実験を管理しようと思ったんですが、見積もりをしてみたところ、Postgresだけで数千円/月行くことがわかり、そこにさらにストレージ代金が乗る計算になりました。

cloud.google.com

電源とか健気に落とせば節約できますが、自分が忘れっぽいので、多分出費が大変なことになるのでこのやり方は断念しました。

感想

Cloud SQLに無料枠があると勘違いしてたので、こんな事やってました。 流石に痛い出費なので、今回はそっとプロジェクトを削除して片付けて終わりました…