papermillとcommuterでJupyterNotebook中心のワークフローを実現する

# はじめに
* JupyterNotebookだけで前処理もモデル開発も全部やりたいなー（特にPoCフェーズだと）、でも管理どうしようかなーと思っていたところに下記記事（およびその関連記事）を読んで、**papermill**と**commuter**といういい感じのOSSを知ったので使ってみました。  
[Beyond Interactive: Notebook Innovation at Netflix](https://medium.com/netflix-techblog/notebook-innovation-591ee3221233)


# 実現できること
* 各データサイエンティスト/エンジニアが各自のローカル環境でJupyterNotebookで前処理やモデル開発ノートブックを作って実行するが、実行結果の共有・管理がめんどくさい
    * -> **papermill**で、実行結果が吐かれたノートブックをS3にそのまま挙げられる
  
* 検証のノートブックを、パラメータを色々変えて実行したいが、シリアルに実行していくのはめんどくさい（ノートブック複製して一気に流してもよいが煩雑になる）
    * -> **papermill**で、ノートブックを外からパラメータを与えてパラレルに実行できる

* papermillによってS3にノートブックが貯まっていくが、確認したいときにわざわざダウンロードするのはめんどくさい
    * -> **commuter**で、S3上のノートブックをブラウザからそのまま確認できる

# 参考リンク
[papermill](https://github.com/nteract/papermill)
> papermill is a tool for parameterizing, executing, and analyzing Jupyter Notebooks.

[commuter](https://github.com/nteract/commuter)

> commuter reads notebooks from a local directory or Amazon S3

# 利用手順
### 通常通りノートブックでコーディング

* 通常通りノートブックでコーディングする

![スクリーンショット 2019-11-05 0.57.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/92368/d178eabe-b773-e8df-dca7-d61f3e7b4d89.png)

### papermillによるノートブック実行

* papermillをインストールする

```python:インストールコマンド
$ pip install papermill
```

* 外からパラメータを与えて実行したい場合は、そのパラメータを書いているセルに、"parameters"タグを打つ

```bash:画面操作
View -> Cell Toorbar -> Tags -> "parameters"
```

![スクリーンショット 2019-11-05 1.14.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/92368/896ad05a-94fe-c6ba-8b41-43b43498458f.png)

* papermillを使って、ノートブックを外から実行する

```bash:ノートブック実行コマンド
papermill sample01.ipynb s3://sagemaker-bucket001/outputs/sample01.ipynb -k python3 -p a 4
```

![スクリーンショット 2019-11-05 1.16.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/92368/85abec3a-f252-c39a-9e72-7ad02e933f93.png)

### commuterによるノートブック確認

* commuter環境をdockerで構築する

```dockerfile:Dockerfile
FROM node:latest

# run installation/ build commands.
RUN npm -g config set user root & npm i --quiet --no-progress --unsafe-perm -g @nteract/commuter

ENV HOST=0.0.0.0
ENV PORT=4000

EXPOSE 4000

CMD npm run start
```

```yaml:docker-compose.yml
version: '3'
services:
  commuter:
    build:
      context: '.'
      dockerfile: 'Dockerfile'
    ports:
      - "14000:4000"
    network_mode: "bridge"
    environment:
      - NODE_ENV=production
      - HOST=0.0.0.0
      - COMMUTER_STORAGE_BACKEND=s3
      - COMMUTER_DISCOVERY_BACKEND=none
      - COMMUTER_PORT=4000
      # - COMMUTER_LOCAL_STORAGE_BASEDIRECTORY=/app
      # - COMMUTER_ES_HOST
      - COMMUTER_S3_BASE_PREFIX=outputs
      - COMMUTER_S3_PATH_DELIMITER="/"
      - COMMUTER_BUCKET=sagemaker-bucket001
      - COMMUTER_S3_KEY=<aws_access_key_id>
      - COMMUTER_S3_SECRET=<aws_secret_access_key>
      # - COMMUTER_S3_ENDPOINT
#    volumes: 
#      - /opt/commuter:/app/commuter
    restart: always
    command: commuter
```

```bash:起動コマンド
$ docker-compose up
```

* S3上のノートブックにブラウザからアクセスする

![スクリーンショット 2019-11-05 8.50.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/92368/182ab0d6-95c9-5e49-7479-ecfe9f2dc002.png)

![スクリーンショット 2019-11-05 8.49.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/92368/c9b9b7c4-4ef6-d0cb-fbb3-d2a53d979064.png)

# おわりに
* これで最低限、S3にノートブック実行結果が溜まるので、後から追うことができるようになるかと。