最近よく Python の深層学習ライブラリ Keras でモデルの学習をしています。
深層学習では一般的にモデルの学習に時間がかかり、GPU (もしくはそれに類する強力な) サーバに常にログインしっぱなしでコンソールを確認しているわけでもないため、都度進捗を報告してくれたらありがたいです。
そこで、Keras のコールバック機能から Slack の WebAPI を叩いてチャットで通知を試みます。
Slack の WebAPI キーの取得
まずは必要な API キーを取得します。
Slack の API キーを取得する作業は、世の中に大量に資料が転がっていますし、公式のドキュメントも親切なので、サマリだけとします。
Slack 公式 から画面上部の「Start Building」ボタンを押します。
すると、APIキーを使用するアプリの名前 (適当で OK です。例えば「notifier」等) と、その API キーを使用したいチームを登録するポップアップが出現するので、適宜入力します。
アプリが登録できたら、今回は外部から Slack に投稿をしたいので、 Incoming Webhooks を有効にします。
あとは画面の案内に従っていけば API キーが発行されます。
API キーが発行されたら、サンプルコードが表示されるので、コピペして一度動作確認してみると良いでしょう。
Keras のコールバックの設定
Keras には LambdaCallback
という、カスタムコールバックを簡単に生成できるクラスが用意されているので、それを使うだけで OK です:
import os
from keras.callbacks import LambdaCallback
hostname = os.uname()[1]
callbacks = []
slack_command = 'curl -X POST -H \'Content-type: application/json\' --data \'{{"text":"Here is {}.\nepoch:{:03d}, loss:{:.7f}, val_loss:{:.7f}"}}\' https://hooks.slack.com/services/<your_key_here>'
slack_callback = LambdaCallback(
on_epoch_end=lambda epoch, logs: os.system(slack_command.format(hostname, epoch, logs['loss'], logs['val_loss'])))
callbacks.append(slack_callback)
# あとはいつもどおり Keras のモデルの学習メソッドを呼ぶときに Callback を渡すだけ
history = model.fit_generator(train_generator, samples_per_epoch, nb_epoch, callbacks=callbacks,
validation_data=val_generator, nb_val_samples=nb_val_samples)
<your_key_here>
の部分は、自分の API キーで置き換えてください。
また、 loss
と val_loss
なにもしなくても存在しますが、他の指標も欲しい場合は、model.compile()
メソッドの metrics
引数に渡せば、その名前で LambdaCallback
中でも参照することが出来ます。カスタムメトリクスの登録については Keras公式ドキュメントの該当ページ が参考になります。
上に貼ったコードからなんとなく伝わると思いますが、LambdaCallback
には on_epoch_end
のほかにも on_epoch_begin
や on_batch_end
といったフックも用意されています。
もっとも、バッチごとに Slack に通知を飛ばされたら鬱陶しいので、この用途では使わないかもしれませんが。
(CSV 等にログをとる用途には便利かもしれませんね)
参考リンク
- Slack API: https://api.slack.com/
- Keras 公式 (Callbacks): https://keras.io/callbacks/
- Python でホスト名を取得する: http://qiita.com/iorionda/items/cfceac93c9e87d430077