Web系の企業でデータサイエンティストをしている者です。
今回はどこでも進捗状況が見れる「notion-tqdm」というPyPIライブラリを作ったので、そのお話をします。
🤔 処理はどこまで完了したのか?
DSの人間なら、以下のようなことを思ったことはないでしょうか?
- あの重たいデータ整形どこまで終わってるかな??
- あのモデルの学習はどこまで完了してるかな??
軽い処理ならtqdm
を仕込めばその場で確認できますが、重たい処理ではそうはいきません。
例えばJupyterで処理を実行する場合、コネクションが切れたりすると再度ノートブックを開いてもtqdm
の反映はそこで止まってしまいます。
そのため、重たい処理の進捗を確認する場合によく取られるケースは以下です
- slack, line 等の botで通知
- 実験管理系のライブラリ(tensorboard, Naptune.ai, MLFlow)等で確認
気軽に仕込んで、いつでも見れるようにしたい
bot導入はトークン取得までが面倒だったり、実験管理系のライブラリはモデルの学習など使える場面が限定されます。
自分がやりたいのは、あくまで tqdm
のようなシンプルで汎用的な進捗の確認です。
🤩 Notion上で見れたら素敵なのでは?
Notionって知ってますか?最近巷で流行っているドキュメント管理サービスです。
Notionの特徴として「データベース」という機能があります。データベースでは一元化されたデータを異なるビューで表示することができたり、リッチなフィルタリングやソート機能がついています。
僕は、Notionのデータベースにプログレス状況をPOSTするようなtqdmを作れば、ビューも機能もいい感じにあるし、コスパ良く進捗が確認できるのでは?と考えました。
つまり「Notionにフロント部分は任せてしまおう」ということですね。
そこで作成したのが、冒頭でも述べた「notion-tqdm」です。
💈 notion-tqdm とは
notion-tqdmはtqdm、つまりプログレスをNotion上で見れるライブラリです。
これでいつでもどこでもスマホでもプログレスを確認することができます。
▶️ Quick Start
事前準備
-
(作っていない場合)Notionのアカウントを作ります。
-
こちらを参考にトークンを取得します。→ メモっておく
-
このページを自分のワークスペースに複製します。
-
notion-tqdmをインストール
pip install git+https://github.com/shunyooo/notion-tqdm
サンプル実行
変数に取得したトークンなどを設定して、以下を実行してみましょう。
from time import sleep
from notion_tqdm import notion_tqdm
# 設定. token やユーザ情報, タイムゾーンを入れる
token_v2 = '<token_v2>'
table_url = '<table_url>'
notion_email = '<notion_email>'
timezone = 'Asia/Tokyo'
notion_tqdm.set_config(token_v2, table_url, notion_email, timezone)
for i in notion_tqdm(range(100), desc='Processing'):
sleep(0.3)
print(i, end=', ')
Notionのテーブルに以下のようなプログレスが出てくるはずです。
ちなみにタイムラインビューを使うと、実行時間が可視化されるので複数プロセスのログを確認するのに便利です。
サンプル: 普通のtqdmと併用したい時
通常のtqdmの表示も見たいというときは以下のようにラップして使いましょう。(ちょっと汚いですが...)
from tqdm.auto import tqdm as tqdm_auto
from time import sleep
tqdm = lambda *args, **kwags: tqdm_auto(notion_tqdm(*args, **kwags), **kwags)
for i in tqdm(range(100), desc='Processing with tqdm.auto'):
sleep(0.3)
print(i, end=', ')
サンプル: テーブルにカスタムなプロパティを追加する
例えば、「どのマシンで実行しているか」や「今の精度はどれぐらい」みたいなプロパティを知りたい場合は以下のようにカスタムなプロパティを設定することができます。注意点として、事前に設定するプロパティをテーブルビューに型を揃えて追加しておく必要があります。
# 事前に machine:Text カラムと precision:Number カラムをテーブルに追加しておく
from time import sleep
notion_tqdm.set_common_props(machine='GoogleColab')
with notion_tqdm(range(50), desc='process') as pbar:
for i in pbar:
sleep(0.3)
pbar.update_props(precision=1-i/50)
🤞 notion-tqdmで素敵なPythonライフを
notion-tqdmはtqdmを継承しています。そのためtqdmと同様の使い方ができ、移行も簡単です。
「プログレスが気になっていたけど面倒くさくて放置していたあの処理」に notion-tqdm を組み込んでみてはいかがでしょうか?
余談 実装の工夫
notion-tqdmの実装では tqdm の更新メソッドをオーバライドしています。
工夫点をあげると、更新メソッドではNotionのAPIを経由して、プログレス情報をPOSTするわけですが、通信コストで処理が重たくならないように、非同期にPOSTするような工夫をしています。また同様に通信コストを少なくするために、1回POSTしたら、次のPOSTまでに3秒以上間隔を空けるようにしています。