はじめに
機械学習を実行するとき、手元に高価な GPU マシンが存在しないので、
よく SageMaker のトレーニングジョブを利用しています
とあるモデルを SageMaker で学習したとき、ログを見るとこんな状態になってしまいました
※被害が分かりやすいように120文字で折り返しています
Epoch 4/10
#015 1/15 [=>............................] - ETA: 13s - loss: 0.4645 - accuracy: 0.9688#010#010#010#010#010#010#010#010#
010#010#010#010#010#010#010#010#010#010#010#010#010#010#010#010#010#010#010#010#010#010#010#010#010#010#010#010#010#010#
010#010#010#010#010#010#010#010#010#010#010#010#010#010#010#010#010#010#010#010#010#010#010#010#010#010#010#010#010#010#
010#010#010#010#010#010#010#010#010#010#010#010#010#010#010#015 2/15 [===>..........................] - ETA: 10s - loss:
0.4206 - accuracy: 0.9844#010#010#010#010#010#010#010#010#010#010#010#010#010#010#010#010#010#010#010#010#010#010#010#01
0#010#010#010#010#010#010#010#010#010#010#010#010#010#010#010#010#010#010#010#010#010#010#010#010#010#010#010#010#010#01
0#010#010#010#010#010#010#010#010#010#010#010#010#010#010#010#010#010#010#010#010#010#010#010#010#010#010#010#010#010#01
....
これが延々続きます
本来であれば、以下のように表示され、プログレスバーが進むはずです
Epoch 4/10
1/15 [=>............................] - ETA: 13s - loss: 0.4645 - accuracy: 0.9688
ローカルの Docker では問題なくプログレスバーが動いているのに、何故 SageMaker だとうまく動かないのでしょうか
実行環境
- ローカルのDocker: 20.10.9
- コンテナのベースイメージ: tensorflow/tensorflow:2.7.0-gpu
- SageMaker のインスタンスタイプ: ml.g4dn.xlarge
学習の実行コード(抜粋)
model = tf.keras.Sequential(
...
model.fit(
train_generator,
epochs=10,
verbose=1,
steps_per_epoch=steps_per_epoch,
validation_data=valid_generator,
validation_steps=validation_steps,
callbacks=[cb_es],
)
TensorFlow の Keras を利用しています
ログの抑制
調べると、 TensorFlow の Issue が出てきました
Keras がプログレスバーを表示するとき、バックスペース文字を使っており、
これがインタラクティブ(対話的)でない環境 = SageMaker のトレーニングジョブでは #010 として表示されてしまうようです
ノートブックで操作しているわけではなく、ログとして出力されているので仕方ないですね
解決策、というか妥協案ですが、
現状では model.fit
の引数で verbose=2
を渡し、進捗表示を少なくするしかないようです
verbose: 整数.0,1,2のいずれか.進行状況の表示モード.0 = 表示なし,1 = プログレスバー,2 = 各試行毎に一行の出力.
0
で全く表示がないのは流石にログの意味がないし進捗が分からなくなるため、
2
で各エポック終了時の値だけ出すようにします
Epoch 4/10
15/15 - 13s - loss: 0.6037 - accuracy: 0.8660 - val_loss: 0.4044 - val_accuracy: 0.9479 - 13s 869ms/step
おわりに
ログとしてはエポック毎に出ていれば十分なので、
SageMaker のトレーニングジョブでは verbose=2
にするのが良さそうです