Google Assistant アプリを作成し、 GPU サーバの状況を確認できるようにした話。
よくあるガイド的なものでなく、筆者の備忘録。
一応リポジトリは public にしておいた。→ https://github.com/nshun/gpu-stats-aog-firebase
ことはじめ
私の研究室では常時 10 台近い GPU サーバが稼働している。
私が研究室に入る前は、各 GPU サーバに SSH なり JupyterHub の terminal 機能を使うなりして、個々人が nvidia-smi
コマンドを打って確認していたらしい。まず、研究室 LAN 内だけでもいいので、すべての GPU サーバの利用状況を確認したいというモチベーションで、以前 Qiita の記事 にも書いた ELK サーバを設置した。
しかし、研究室 LAN に入らないと確認できないため少し不便であった。一応 VPN を使えば Kibana にはアクセスできるようにしていたので、研究室外でも確認しようとすればできたが...(スマホから確認したいモチベーションがあった。)
それで、どうせなら Google Home を使ってエモく確認したかったので Google Assistant アプリで実現してみることにした。簡単でいいなら IFTTT が有力候補だろうか?
全体像
GPU サーバの利用状況のデータを Google Cloud Functions を用いて Firestore に格納。
Google Assistant に登録する Actions on Google アプリが Dialogflow を用いて会話内容からタスクを判断し、 Google Cloud Functions を使って Firestore に格納されたデータを参照。ユーザーのもとにそのデータを戻していく。
設定手順
- Actions on Google でプロジェクトを作成
- Dialogflow でインテントを登録
- Firebase でデータベースを作成
- Cloud Function を登録
Actions on Google (AoG)
Google Assistant アプリは、すべてここ Actions on Google で作られる。
Google アカウントでログインしたら、 GO TO ACTIONS CONSOLE
を押し、 Add/import project
で新規プロジェクトを作成する。
- Project Name →
GPU STATUS
(お好みで) - Language →
Japanese
- Country →
Japan
Welcome 画面は無視し、プロジェクト画面で一から設定していく。
プロジェクトの Overview
で Add Action(s)
を押し、 ADD YOUR FIRST ACTION
, Custom intent
, BUILD
の順に押していくと、
Dialogflow に移るので、こちらも新規エージェントを作成する。
Dialogflow
- Agent Name →
GPU_Status
- DEFAULT LANGUAGE →
Japanese - ja
- DEFAULT TIME ZONE →
(GMT+9:00)Asia/Tokyo
- GOOGLE PROJECT →
gpu-status-xxxxx
(xxxxx 部分はそれぞれ固有の ID が割り当てられる)
最後に CREATE
で作成。
すると自動的に最初に作成した AoG プロジェクトとのパーミッション関係の連携を行ってくれる。
リポジトリ にある gpu_stats.zip
をインポートし、簡単なインテントの設定を済ませる。あとは Cloud Functions で設定し、 Webhook を用いてレスポンスを作る。
もとの AoG プロジェクトに戻る。
(AoG 内) 左側のタブで Advanced Options
内の Backend services
で Cloud Functions
内の View in Firebase
で連携された Firebase 画面に移れる。
Firebase
Database
タブで データベースの作成
, テストモードで開始
, 有効にする
とすることで Cloud Firestore を有効にする。
手元の PC で
リポジトリ を clone する。
npm i -g firebase-tools
firebase login
で firebase の CLI ツールを使えるようにする。
firebase list
で先程作った Firebase プロジェクトの ID を確認する。
gpu-stats-aog-firebase/blob/master/functions/src/index.ts
の serverImages
, defaultCarousel
を対応する GPU サーバの名前と画像に変える。
firebase use ${Project id}
cd ./functions/
npm i
firebase deploy --only functions
以上をすることで Cloud Functions に firestore に格納する用の関数と、Dialogflow の Webhook 先になる関数を登録する。
登録されたら、Firebase の Functions
でエンドポイントとなる URL を確認できる。
Dialogflow 左側のタブから Fulfillment
に移動し、Webhook
を有効にしたあと、 確認した dialogflowFirebaseFulfillment
の URL を入力し、画面下の SAVE
で保存。
GPU サーバ側
GPU サーバに リポジトリ 内の sendlog.sh
を設置し、 2 行目を GPU サーバの名前にし、 3 行目を Firebase で確認した storeFirebase
の URL に変える。
chmod +x ./sendlog.sh
で実行権限を与えたあと、試しに ./sendlog.sh
で実際にログが送信されているか Firebase 内の Database で確認する。
無事確認できたら、このスクリプトを cron 実行させるように設定する。 Ubuntu の場合は
crontab -e
で登録できる。登録する GPU サーバの台数にもよるが、 Cloud Functions は無料で使えるリクエスト数が限られているため 5 分に一回位がおすすめ。
AoG
AoG の Overview
タブで足りないものを埋めていく。
埋めたあと、 Simulator
タブを開き右上のアイコンの中から ラップトップとスマホのアイコンを選択。実機でのシミュレーションを有効にする。
実機で同じ Google アカウントでログインした Google Assistant で設定した名前で ~ につないで
と話しかけ、選択画面が出て、それを選択することでステータスを確認できたら成功。
一応 Google Home でも GPU 使用率のみかえせるようにしてあるので、もし持っていたら試してほしい。
シミュレーションは 1~2 時間で無効化されてしまうので、 Release
タブで Beta 版をリリースする。 Beta 版は特に審査もなく、共同プロジェクトにしていなければ自分のみが使えるリリースとなっている。他の人とも共有したいのであれば Alpha 版のリリースが必要となるが、こちらは割と審査が厳しく時間もかかるので覚悟が必要。
カスタマイズ
さらに以下のあたりに改善の余地があると思うので、ぜひ自分の好みにしてほしい。
-
Dialogflow
- 会話のバリエーションを増やす
- Google Home で
- プロセス情報を利用
- メモリ解放忘れを通知
- Google Assistant 以外 (Slack など) への対応
-
Firebase
- ログの送信を 1 つのサーバからまとめて行うようにする
- ただの CPU 計算機サーバへの対応
-
GPU サーバ側
- GPU を使ってるプロセスの CPU/メインメモリ の使用率も収集
完成イメージ
蛇足
Alpha 版リリースにはプライバシーポリシーをこのアプリ用に作成する必要があるが、 Gist の raw へのリンクでも審査が通ったのであまり難しく考える必要はないかも。