七難ハック
SageMakerは謎のMetricsを追加してくる
最終更新: 2021/08/07

先日会社のブログにSageMakerの話を書いたら思いの外好評で嬉しかった@ken11です

今日はそのSageMakerの小ネタ的な話を


SageMakerにはExperimentsという実験管理の機能があります。
これは学習時のコードだったりデータだったり、あるいはモデルの評価だったり、使用したインスタンスの情報も含め様々な情報を保存しておいてくれる機能です。
SageMakerで学習を行うなら使わない手はないって感じの機能ですね。

このExperimentsでTrainingの結果を確認すると、謎のMetricsが追加されていることがあって、今日はその話です。

TrainingでMetricsを設定する

SageMakerでTrainingする際、lossやらaccuracyみたいなMetricsは自分で設定することになります。(ビルトインのアルゴリズムではそうでもないらしいけど)
正規表現を使って、ログ出力から取得するというなんとも力業な方法。

コンソールでもこんな感じで設定できますし、SDKでもオプションで設定できます。詳細はこの辺

ちなみにこのMetricsは1分に1回しか取ってくれないようなので、1エポックに1分もかからないような学習だとあまり期待した数値は取れないかもしれないです。
間隔短くさせてくれえええ

結果をExperimentsで確認する

さて、Metricsを設定したうえで学習した結果を、Experimentsで確認してみます。するとどうでしょうか、画像のように、謎のMetricsが追加されていることに気づきます。

この _TRAIN とついたMetricsはなんなのでしょうか?
僕が追加しているのは lossaccuracy のみです。
微妙に数値が違ったりもするので心底気になります。
しかもこれ、Experimentsの画面では出現するんですが、 TrainingJobAnalytics とかコンソールのMetrics、あるいはCloudWatchにも全く出現せず、Metricsとしては全く追加されていないものがMetricsとして表示されているという薄気味悪い状態が発生します。

Frameworkコンテナを利用した場合のみ追加される?

この謎Metricsですが、SageMaker側で自動で追加されるものだということはAWSに問い合わせて確認しました。ただ、自動追加といってもいったいどこで誰が追加しているのかは、残念ながら未だにわかっていません。
わかる範囲のコードは一通りなめたんですけどね。見つけきれなかった。

一応自分の方では、独自アルゴリズムを使ったオリジナルのコンテナでは追加されず、Tensorflowの予め用意されているFrameworkコンテナを利用したときは追加されているというところまで検証しています。
ビルトインコンテナなのでよかれと思って追加されているのかなんなのか。そのわりには metric_definitions を設定しないとなにもついてこないし。
コンテナというよりSDKのクラスのどこかで追加されているのではないかって睨んでますがちょっとわかんないですね。いや、コンソールからやっても同じ結果になりそうだしSDKではないのか。マジでなんなんだろうこれ。
これ以上深追いするのも疲れるので追跡はここまでとしました。


とりあえず、「SageMakerでなんか謎のMetricsがついてるんだけど!?」ってなっても慌てなくて大丈夫そうです。
自動で追加されてるだけみたいなので、必要ないなら無視してしまって問題ないんじゃないかっていうのが自分の結論。気になるならビルトインコンテナ使わずに自分でコンテナ用意するといいと思います!