chainerのExtensionとslackのIncoming Webhookを使う
動機
僕は研究室の端末からどこかに置いてあるサーバに繋いで研究をしているんですが、
1回学習を始めてしまうとbashを落とせなくて困っていました。
よくよく調べてみると、なんかnohupとか言うのを使うとバックグラウンドでもジョブを継続できるらしい。
www.codereading.com
これは素晴らしいと飛びついてみると、「これじゃいつ学習が終わったかわかんねぇぞ」となるわけです。
ということでslackのIncoming WebhookとchainerのExtensionを組み合わせてepochが終了するごとにメッセージを送ろうとういうお話です。
コード
とは言っても世の中に賢い人はいっぱいいるので僕が思うことなんて大抵は実装されています。
nonbiri-tereka.hatenablog.com
この記事を参考にしつつかなり簡素化したものが以下のコードになります。
from chainer.training import extension import json import requests class SlackReport(extension.Extension): trigger = 1, "epoch" def __init__(self): self.post("実験を開始したよっ!") def __call__(self, trainer): log_report = trainer.get_extension("LogReport") log = log_report.log epoch = log[-1]["epoch"] self.post("{}epochが終了したよっ!".format(epoch)) def post(self, text): payload = {"text":text} requests.post("<Webhook URL>", data=json.dumps(payload))
後はこれをtrainerにextendしてやるだけです。
trainer.extend(SlackReport())
シンプルイズベストだなぁ。