気が向いたら書くやつ

なんかプログラミングのことについて

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())

シンプルイズベストだなぁ。