debug力があれば軽減されるノートブック入門のあるある
久保田史洋氏(以下、久保田):今日は5分のLT(ライトニングトーク)なので、5分で終われるかがちょっと不安ですが、急ぎ足で「jupyter notebookでのdebug入門」というタイトルで発表します。よろしくお願いします。
自己紹介も短めです。「Twitter」「Kaggle」を「fkubota」という名前でやっています。バンドルカードの株式会社カンムで、機械学習エンジニアをやっているKaggle Expertです。
コンテンツは、主にビギナーに向けて話します。2本立てで、「debugについて」「jupyter notebookでdebug入門」という内容で発表します。
さっそくですが、「あるある」かなというお話をします。コンペを始める時は「コンペやったるでー!」とテンションが最高潮です。イケてるノートブックを見つけて、これを参考にしよう、これで入門しようと思います。
そのあと「うーん、人のコードを読むのしんどいなぁ」となると思います。自分の環境だと動かないので修正が必要で「ぴえんこえてぱおん」状態になって、「コンペちょっとだるいな」とか「やめちゃう」とかある気がします。
3番目のしんどい部分ですが、debug力があれば軽減されるよねというのがモチベーションです。
「こんな経験はないですか?」ということで、よくある例としてKaggleのノートブックを参考にしている状況を思い出してほしいのですが、classAの中にfuncBがあって、funcBの中にfuncCとかDとか、深い構造があります。
「outputFが重要らしいから、ここを見たいんだけど、深いから理解するのは大変だなぁ」みたいなのがあって、こういう時は、outputFやinput_をprintで見るかなと思います。print debugと呼ばれるものです。
print debugも別に悪くはないし、僕もメチャクチャ使いますが、これだけだとしんどいのは当たり前です。なので今日はdebugをしたほうがいいという話をします。
単純に面倒くさいというのもあるのですが、深くにあると、funcDに到達するまでにいろいろな経路を通ってくるので、単純に1個1個時間がかかるんですよね。
時間がかかると、試行錯誤の数も減ってしまいます。例えばさっきのprintで見ているのを、「これじゃあわからないから」とinput_のshapeを見るために、shapeを付けて実行する……shapeを見るだけなのに、深くにあるせいで30秒かかっちゃうとかは「あるある」だと思います。
あとは、plotしてみるけどエラーが出てしまった、このエラーに気づくのに30秒かかるとか。深いところにあるものをprint debugだけでやろうとするとしんどいです。
デバッガの体験サンプルを作成
そういうのは、デバッガを使うと左の複雑な状況から、右の感じになります。ツールは「pdb」「ipdb」「IDE」「PyCharm」とかいろいろとあります。デバッガも.pyと.ipynb、ノートブックとかいろいろとあって、今日はノートブック形式で話を進めます。ノートブック形式で入門する人が多いのと、参考資料がぜんぜんないのがモチベーションです。
さっそく「どれがいいんですか?」ですが、いろいろとあるんですよね。しかもその一部しか抜き出していなくて、右に行くほど高機能です。
ここが環境です。「JupyterNotebook」とか「JupyterLab」とか「KaggleNotebook」「Colaboratory」と書いています。それぞれを動かすのにどれだけ大変かを○、△、◎で表しています。
この◎は、特に何もしなくてもすぐに動かせるツールなので、今日は「pdb」と「%debug」を紹介します。時間がないので、動かせて学べるサンプルを用意しました。
タブ切り替えて「Colaboratory」で上から動かしていって、僕が書いた指示どおり動かせば、デバッガを体験できるものを作りました。
あとはこれをやってください。わざとエラーを起こさせたり、よくわかんない動作を紛れ込ませたりしているのを、デバッガ使って直していくのを体験できます。せっかく作ったので、よければ使ってみてください。
ぜんぜんdebugをやったことがない3人に試してもらって「よくわかりました」と言われたので、たぶん大丈夫だと思います。なにかあればDMでも教えてください。
これで以上です。ありがとうございました。
司会者:ありがとうございます。「Colaboratory」にサンプルがあるのでメッチャいいですね。私もおかげでdebugを最近少しできるようになってきています。
久保田:よかった、ありがとうございます。
司会者:5個ぐらいあったやつとか、ぜんぜん知らなかったです。デバッガってこんなにたくさんの種類があるんですね。ちなみに久保田さんはどのデバッガを使っていますか?
久保田:結局「%debug」「ipdb」の2つかな。
司会者:どっちも似たような使い心地でしたっけ? コマンド的には一緒ですか?
久保田:動かすdebugは一緒なんですが、使うタイミングがちょっと違います。%debugはあと出しで、エラーが起こった後実行できるので、基本的には使い方が違いますね。一応その気分の使い分けも、Colabで説明しています。ipdbとpbdが同じような感じです。
司会者:ありがとうございます。