くろたんくブログ

Practice Makes Permanent

このエントリーをはてなブックマークに追加

2019年 9月 12日 木曜日 00:02:28 JST(modified: 2019年 9月 12日 木曜日 21:42:40 JST)
views: 995, keywords: papermill, tech

papermillをつかって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の状態

output.ipynbの状態

みれば意味がわかると思うが、これがinjectionとよんでいるもの

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

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

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

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

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

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

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

prev:bashcmsでハマったポイント next:意思決定とdefault action