焼肉が食べたい

ただの日記です。技術的に学んだことも書こうと思っていますが、あくまで自分用メモです。 プロフィールはこちら。https://chie8842.github.io/aboutme/

時間のかかるデータ処理や機械学習処理が終わったら通知してくれるツールをつくった!

Pythonのメソッドにデコレータをつけるだけで、その処理が終わったらSlackやメールや画面のポップアップで通知してくれるツールを作りました。

github.com

正直そんなに大したツールではないんだけど、 こういう時間のかかる試行錯誤をサポートしてくれるツールを便利だと思ってくれる人が他にもいたらうれしいな、と思うのでブログに書いてみます!

作った背景とコンセプト

わたしは普段、機械学習や、大量データに対するデータ処理や分析をやっています。 いつも時間がかかるスクリプトを回しながら他の仕事をして、定期的にスクリプトが終わったか確認するということをしていたのですが、 これが面倒なので、処理が終わったら通知してくれると便利だなと思ったのが作るきっかけです。

ちなみに、kerasやtensorflow、chainerなどを使う場合だと、以下のツールがあります。

Hyperdash | Machine Learning Monitoring

Hyperdashは、フレームワークからメタデータを取得してスマ―トフォンで機械学習の詳細な進捗具合を見ることができるなど多機能です。 これはすごく便利なのですが、限られディープラーニングフレームワークでしか使えません。 また、利用するフレームワークによって実装方法が異なり使い方が少し複雑です。

わたしはディープラーニング以外に、PySparkを使った分析や、SQLAlchemyを使ってRedShiftに接続してPythonからSQLを実行するということをやることも多いです。 なので、いろいろな場面で使いやすいものがほしいと思い、

  • 汎用的に使えてかつ使い方が簡単
  • 終わったら通知するだけのシンプルな仕様

をコンセプトとして作りました。

使い方

使い方はめっちゃ簡単で、pipでインストールして、configファイルに数行の設定を書いて、処理が終わったら通知してほしいメソッドの上にデコレータをかくだけです。

インストール

pip install easy_notifier

デコレータの記述

@easy_notifier(~/.easy_notifier.cfg)
def test_method()
    ・・・
     処理の中身
    ・・・

test_method()

通知の結果はこんなかんじです。

Slackでの通知

メールでの通知

macのポップアップでの通知

通知の中のreturnはreturn valueで、返り値を表示します。 今見るとわかりにくいのであとで修正しておこう。。。

設定ファイルの中身はこういう感じです。 必要なところだけ埋めて使います。

[easy_notifier]
env = ec2
process_name = test_process
notify_slack = true
notify_gmail = true
notify_mac = false
incoming_webhook_url = 'https://slack/testurl'
slack_id = my_slack_id
channel = my_slack_channel
from_address = test@gmail.com
from_password = password
to_address = test2@xxx.com

以下は各パラメータの説明です。

パラメータ 説明
env 上の通知のinstance_nameの取得方法で、ec2、local、gceのいずれかを指定します。EC2の場合はNameタグをinstance_nameとして利用します。localの場合はhostnameがinatance_nameとなります。gceはまだ実装していなくて、hostnameがinstance_nameとなります。
process_name 上の通知のprocess_nameの表示内容を指定します。何も指定しない場合は、デコレータをセットした対象のメソッド名が利用されます。
notify_[slack|mac|gmail] それぞれ、slack、macのポップアップ、gmailからのメール通知を使うかどうかを設定します。trueもしくはyesの場合、その通知方法での通知が行われます。macのポップアップでの通知をLinuxWindows上で指定した場合は無視されます。
incoming_webhook_url slackでの通知を行う場合は、slack上で通知を受け取るためにincoming_webhookの設定を行い、そのURLをこのパラメータに設定する必要があります。
slack_id ここに、slackのDisplay nameを設定すると、その人にメンションされます。
channel slackで通知してほしいチャンネルを設定します。
from_[address|password] gmailからのメール通知を行う際の通知元のgmailアドレスとパスワードを設定します。
to_address 通知先の任意のメールアドレスを指定します。

あとTODOとして、jupyter notebookのマジックコマンドでも同じことできるようなの作ったら便利かなと思っています。 以上です。 もし使ってやってもいいよという人がいたら、感想とか教えてもらえたらとてもうれしいです!