くろたんく雑記帳

日常とか、わんちゃんとか、機械学習とか、競プロとか、

MENU

papermillをつかってJupyter notebookのままバッチ実行(旧ブログからの再掲)

以前自前サーバーで書いていた記事の再掲。 NetflixがpapaermillというJupyter notebookをそのまま実行して、開発に持っていけるツールを開発していて、まぁ場面は限られるけれどそこそこ使えたのでそのまとめ記事


若干古いネタなんだけどpapermillをつかったのでメモ
詳細はJupyter notebookをそのうちまとめる
追記:画像を貼り付けた

1年くらい前にNetflixこちらの記事で紹介してた。データサイエンティストがJupyterで分析に使ったものをそのまま(ゴミセルなどは整理するべきだが)実行できるため、開発にそのまま使える。

papermill ./input.ipynb ./output.ipynb 

などとして、結果を出せる。

パラメータ設定をしていれば、パラメータ設定した直後にセルがinjectionされてパラメーターが再代入されるため、設定したパラメーターで実行した結果が出力される

papermill ./input.ipynb ./output.ipynb -p alpha 0.6 -p l1_ratio 0.3

上記のコマンドを実行すると以下のようになる

input.ipynbの状態

f:id:black_tank_top:20200716143022p:plain
input.ipynbの状態
output.ipynbの状態
f:id:black_tank_top:20200716143012p:plain
output.ipynbの状態
みれば意味がわかると思うが、これがinjectionとよんでいるもの

ちなみにセルの上部にparametersとあるのは、パラメーター指定する場合、初期設定でやらなくてはいけないことでView > Cell Toolbar > Tagsとしてそこにparametersと入力したセルがコマンドからの-pを受け付ける

csvなどを出力するようにJupyterに書いておけば、コマンドラインだけでテンプレートJupyterに書いたもののパラメーターを変更した結果を得ることができて便利。

ただし、パラメーターで許されているのは数字か文字列なので、複雑なパラメーター(例えば、bigqueryのPython APIのパラメーターのようなリスト形式)は扱いが若干面倒。Jupyter notebookを見た方が話がはやいのでそちらを見てもらうことにして、テンプレートのJupyterをいい感じに工夫すれば、複雑なパラメーターでもとりあえず大丈夫。例えば以下のようにして

papermill ./input.ipynb output.ipynb -p parameter "[bigquery.ScalarQueryParameter('week', 'STRING', '2019-06-23')]"

f:id:black_tank_top:20200716143007p:plain
bigquery parameterのinjection

本来はリストで入れるべきだが、papermillの仕様(シェルスクリプトの仕様)で文字列でしか受け付けないのでテンプレートでもリストを""でくくってオブジェクトに代入して、evalで評価することで解決できる。

f:id:black_tank_top:20200716143017p:plain
sqlのパラメータの埋め込み

なので、まぁ結構有用に使える。ハイパラを変更するような形では使わないけど、日付を逐次変えていくようなものに関してはスケジューラーと相性がよいとおもう。 実用的には、普通にアドホックな感じで書いて、結果がいい感じなら開発に回すように、ゴミセルは整理して、データ取得を適当なクライアントで取得するようにしてそので日付列をパラメーター設定してbigqueryから所定の日付範囲のデータを取得して、あとは適当に機械学習をへて、アウトプットをcsvで吐くようなテンプレートのJupyterを用意してCronで定期実行すれば、Jupyterだけで完結するので、.ipynbを.py形式になおして引数設定する必要もないし、かなり便利だった。

Jupyterの例をそのうちupする 追記:GitHubにサンプルupした GitHubで見れない時はnbviewerでurl入力すればみられる