こんにちは!データサイエンティストの青木和也(https://twitter.com/kaizen_oni)です!
この記事では、リモートGPUでモデルの学習をするときに、モデルの学習が終わったらslackに通知してくれる仕組みの実装方法をご紹介します!
特に、nohupと組み合わせれば、外出前に学習を返させて、出先から学習が終了したかどうかを確かめる仕組みを構築できるので大変便利です!
自動通知機能の全体像
今回紹介する自動通知機能は以下の図のような構成となっています。
まずはslackでの準備から見ていきましょう。
slackへのIncoming Webhooksの追加
まずはPythonからslackにメッセージを送信するための準備として、slackにIncoming Webhooksを追加しましょう。
Incoming Webhooksの説明は以下のように記載されています。
Incoming Webhooks are a simple way to post messages from external sources into Slack. They make use of normal HTTP requests with a JSON payload, which includes the message and a few other optional details described later.
GPT訳: Incoming Webhooksは外部ソースからSlackにメッセージを投稿する簡単な方法です。これらはJSONペイロードを含む通常のHTTPリクエストを使用します。このペイロードにはメッセージと、後ほど説明されるいくつかのオプションの詳細が含まれます。
まずはslack左下の「App」から「アプリを追加する」をクリックします。
次に検索窓に「incoming webhooks」と入力し、検索結果に出てきたIncoming Webhooksの下にある「追加」ボタンをクリックします。
Webブラウザにリンクされるので、「Slackに追加」をクリックします。
設定画面が出てくるので、「チャンネルを選択」からメッセージを投稿したいチャンネルを選択し、「Incoming Webhookインテグレーションの追加」をクリックします。
すると、セットアップの手順の説明が出てくるので、そこに記載されている「Webhook URL」をメモ等にコピペしておきます。
これでslack側の準備は完了です!
学習モデルのプログラム側の準備
次に、学習モデルのプログラム側の準備に入っていきます。
まずは、以下のコードをモデルを学習するプログラムの先頭行にコピペします。
import requests
import json
def inform(str):
WEB_HOOK_URL = 'https://hooks.slack.com/services/XXXXXX/XXXXXXX'
requests.post(WEB_HOOK_URL, data = json.dumps({
'text': str
}))
なお、WEB_HOOK_URLの部分には先ほどslack側の準備の際に出力されたURLをコピペします。
最後にデータ加工後、モデルの学習後などの通知が欲しい箇所に、上記のinform()関数を挟みます。
例えば、私であればHugging FaceのTransformerモデルの学習前と学習後に以下のように実装しています。
inform('モデルの学習を開始します')
trainer.train()
inform('モデルの学習が終了いたしました')
inform('モデルの保存を行います')
trainer.save_model(OUTPUT_DIR)
inform('モデルの保存が終了しました')
私が実際にやっている自動化学習方法
余談にはなりますが、私がどのようにリモートGPU環境でモデルの学習を自動化しているのかをご紹介いたします!
1. Jupyter notebookで機械学習モデルの実装を行う
まずは、Jupyter notebookで機械学習モデルの実装を行います。
この際に、先ほどのIncoming Webhooksでslackに通知を送るようのコードを仕込んでおきます。
なお、学習モデルを実装し終えたら「display()」や「!pip install 〇〇」のようなJupyter notebookでしか動作しないようなコマンドはコメントアウトしておきましょう!
2. nbconvertでnotebookをスクリプトに変換する
リモートGPU上のターミナルで以下のコマンドを使って、Jupyter notebookをPythonスクリプトに変換します
jupyter nbconvert --to script [さっき作ったnotebook名].ipynb
3. nohupを使って、先ほどのプログラムをバックグラウンド実行する
リモートGPU上のターミナルで以下のコマンドを使って、先ほど作成したPythonスクリプトをバックグラウンド実行します
nohup python3 [さっき作ったPythonスクリプト名].py &
これで、ターミナルを閉じたとしても、Ctrl + Cを押してしまったとしても、何らかのエラーを吐くまではバックグラウンド実行をしてくれます。
nohupで実行したプログラムを強制終了したい場合のTipsは以下の記事をご参照ください。
上記までの流れを実装することができれば、ターミナルを起動していなくてもリモートGPUでモデルの構築ができる、かつ、学習が終わったら通知が来るような仕組みを構築することができます!
まとめ
今回の記事では、リモートGPUで学習をした時の学習の進行状況等の把握に便利なslackのIncoming WebhooksとPythonスクリプトの連携方法についてご紹介しました!
この機能を実装しておけば、モデルの学習の終了したタイミングで次のモデルの学習のために動き出せたりと応用場面は多いので、ぜひ活用してみてください!
コメント