Jupyterで全てを完結させる 〜nbdevの紹介〜



この記事はバカン Advent Calendar 2019の4日目の投稿です。
Jupyterer向けの記事となります。
理解不十分な部分もあるため、[詳細は公式を確認してください。](https://www.fast.ai/2019/12/02/nbdev/)


## nbdevとは
おそらく簡潔にいうと、IDEの役割を含めることで、Jupyter Notebook1つで作業を完結させるPythonのプログラム環境のことです。
[fast.ai](https://www.fast.ai/)が作成しており、現在開発中の[fastai v2](https://forums.fast.ai/t/fastai-v2-read-this-before-posting-please/53517)もnbdevを用いているとのことです。



現状、EDAやモデル構築などの試行錯誤はJupyter Notebookを用いて行われることが多く、"exploring"の役割として存在しています。ですが、それ以降のフェーズではIDEを使うのが一般的とされています。

nbdevでは以下のような機能を提供することで、jupyter上で完結することを試みています。
・pyファイルの作成
・READMEの作成
・Visual diff
・merge conflictの確認、修正

（[以下公式から拝借](https://www.fast.ai/2019/12/02/nbdev/#so-whats-missing-in-jupyter-notebook)）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/248638/fbfbd903-830c-4126-c202-08a70aaeb75c.png)



## チュートリアル・使い方
以下はMacで行なっていますが、Winでも手順は変わらないです。

### インストール 〜 Jupyter開くまで
1- ターミナルから以下コマンドでインストールします。
``pip install nbdev ``


2- [公式がテンプレートを作成している](https://github.com/fastai/nbdev_template/generate)ので、それをもとにRepositoryを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/248638/b33f9747-bc6b-1417-4799-1f2e5364f5ba.png)


3- 作成したRepositoryをCloneします。
``git clone [以下URL]``

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/248638/1ae57fa0-b5f6-fa0d-cc13-ea399c306bec.png)

4- 連携するRepositoryの情報を加えるため、`settings.ini`を編集します。
　 `settings.ini`の以下項目のコメントアウトを外し、記入例のように編集します。

＜編集前＞
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/248638/f9f1e8d9-e3fd-e0f1-c5a1-63ceeb9cb735.png)

＜記入例＞
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/248638/3a048935-9fc2-ee88-6726-4cf18d810294.png)

lib_name, user, descriptionは作成したrepositoryに対応させます。
keywordsは何を指しているか不明ですが、適当な文字列を入れてください。
※ copyrightまで記載しないと、次の手順でコケます。


5- ターミナルから以下コマンドを打ちこみ、lib_nameのディレクトリを作成します。
``nbdev_build_lib``

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/248638/d4dadb5c-dc47-088b-1d78-d9896a5c650d.png)

(上の画像ではPipfileとPipfile.lockが表示されてますが、関係ないので無視してください)


6- ``jupyter notebook``でJupyter Notebookを開きます。


### pyファイルの作成
``00_core.ipynb``を開き、以下手順でモジュール作成を行います。
1. python moduleに変換するものに関して、該当セルの先頭に``#export``を加えます。
2. 以下2行をセルに打ち込み実行します。(もしくはterminal上で``nbdev_build_lib``を実行します。)
   ``from nbdev.export import *``
   ``notebook2script()``

＜以下例＞
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/248638/a7a7075b-8631-3243-f8d3-2fb3c304738f.png)

これによって、`#export`で指定したものが、lib_nameディレクトリ配下の``core.py``に記載されます。
手順2を実行するたびに`core.py`が更新されるため、追加に加え、既存セルを消去すれば削除も可能です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/248638/6aacb793-1547-db5e-2acd-714470abde66.png)


### READMEの編集
`99_index.ipynb`を開くと以下テンプレートが表示されます。
`#hide`が記載されたセルは非表示となるため、ここで`#export`したもの含めモジュールをimportしていきます。

＜テンプレート＞
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/248638/3f27b9d1-e28c-d4b8-4309-26228aa74349.png)

＜以下例＞
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/248638/d0fd9715-59d7-f983-ef8d-6512d6c8b4dd.png)

編集完了後、terminal上で`nbdev_build_docs`を実行することで、ディレクトリにある`README.md`が更新されます。

その後、remote repositoryにpushするとgithub上のREADMEでは以下のよう表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/248638/a830b364-ce6b-11ee-34ea-a96e44367d54.png)


## おわりに
[いかがでしたか？](https://www.google.com/search?ei=BGXmXczDEIj90gTEkJ-IDg&q=%E3%81%84%E3%81%8B%E3%81%8C%E3%81%A7%E3%81%97%E3%81%9F%E3%81%8B&oq=%E3%81%84%E3%81%8B%E3%81%8C%E3%81%A7%E3%81%97%E3%81%9F%E3%81%8B&gs_l=psy-ab.3..0l9j0i7i30.0.0..1423...0.0..0.158.225.1j1......0......gws-wiz.dTg3WBRsT_o&ved=0ahUKEwjM1ZHXzJnmAhWIvpQKHUTIB-EQ4dUDCAs&uact=5)
nbdevの概要、使い方の一部を紹介してみました。
本記事を通して、nbdevを使ってみるきっかけになれば幸いです。
カバーできていない部分もあるため、以下の参考文献を確認してみてください。

## 参考文献
・[nbdev: use Jupyter Notebooks for everything](https://www.fast.ai/2019/12/02/nbdev/#so-whats-missing-in-jupyter-notebook)
・[Welcome to nbdev](http://nbdev.fast.ai/index.html)
・[Nbdev discussion](https://forums.fast.ai/t/nbdev-discussion/59145)
・[A Step-by-Step Introduction to Starting nbdev — Exploratory Programming](https://medium.com/@gharibimo/a-step-by-step-introduction-to-starting-nbdev-exploratory-programming-4a761ed1f796)
・[今度こそ挫折しない git 入門 第1回](https://qiita.com/kakinouchi/items/be54d21adcac1debc0c0)



## 参考リンク
・[株式会社バカン（Vacan, Inc.）](https://www.vacancorp.com/)
・[バカン (Vacan) Advent Calendar 2019](https://qiita.com/advent-calendar/2019/vacan)

## 参考情報
[弊社代表取締役](https://www.wantedly.com/users/531556?aql=gaFxr2thd2FubyB0YWthbm9idQ)はKaggle推しです。