Colab Proを用いたsshログイン→GitHubからクローンして実験再現

# なんの記事？

これまでPaperSpaceで自然言語処理の実験用に使用していたのですが、

* 高い
* 安く何度も実験したい。
* 自分が行った実験を、他の人でも手軽に再現できるようにしたい。

などの理由から、Colabを使ってみようと思い、この記事を書きました。

本記事では、[メイン実験](https://qiita.com/izuna385/items/367b7b365a2791ee4f8e)と[サブ実験](https://qiita.com/izuna385/items/bce14031e8a443a0db44
)をColab-Proで再現することを目標にします。（本記事を通して、より多くの人にエンティティ・リンキングの面白さを手軽に体感してもらえたら、とても嬉しいです。）

https://qiita.com/izuna385/items/367b7b365a2791ee4f8e

https://qiita.com/izuna385/items/bce14031e8a443a0db44

【注】Colab-Proが契約してあることが本記事の前提になります。契約状態であれば、[ここ](https://colab.research.google.com/notebooks/welcome.ipynb?hl=ja)にアクセスした場合、左上のアイコンがPro使用になっています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/357766/cf1be8bf-516a-d35f-419e-78f19b6073ca.png)
# gitを用いたDeepLearningの実験再現

実際に、[実験リポジトリ](https://github.com/izuna385/Entity-Linking-Tutorial)をColab環境に落とし、`ssh`でColab-Pro（GPU）にログインして実験を完了させることを目的とします。

## Colab-Proのセッション開始
Colab-Proの使用には月額1,000円程度が必要です。事前に契約してあることを前提にします。

* [ここ](https://colab.research.google.com/notebooks/welcome.ipynb?hl=ja)にアクセスし、左上からノートブックの新規作成をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/357766/e86077f3-4c26-eec2-95bf-479470dad395.png)

* ランタイム→セッションの管理をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/357766/3ad8af55-8ab1-ca68-193c-5f2c1670f208.png)

* 「他のセッションをすべて終了」をクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/357766/f0531c20-120d-abdb-7d4e-7e5fddb6db02.png)

他のセッションが生きている場合、本記事はエラーが出る可能性が高いです。事前に他のセッションをすべて終了させて下さい。

## GPUランタイムへの変更
* ランタイム→ランタイムのタイプを変更　をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/357766/7bce44a3-554a-ab32-1b25-34be4652fed3.png)

* ハードウェアアクセラレータをGPUに変更→保存 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/357766/118464fe-b26b-50e1-0610-a4f63ff7f464.png)

## 作製したノートブックセッションへのsshログイン
* https://dashboard.ngrok.com/get-started/your-authtoken にアクセスし、トークンをコピーします
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/357766/e8ce974c-e01b-cc6a-c8b3-2d5187829c5f.png)

* sshのポートを開ける。
  以下をセッションに貼り付け実行します。
  
```python3
!pip install colab_ssh --upgrade
from colab_ssh import launch_ssh

ngrokToken = "your_authtoken" # 先にコピーしたトークン
launch_ssh(ngrokToken, password="your_password")
```

  成功した場合、以下のようなsshログイン情報が与えられます。

  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/357766/5dcbac29-977e-65ff-2f3b-d1fc7114e3e5.png)


*  先程の情報を元に、ローカルのターミナルからssh ログイン
     
    `ssh root@8.tcp.ngrok.io -p 14082`
  
     Are you sure you want to continue connecting? -> yes でOK.  

     パスワードを聞かれるので、先程記入した`your_password`を使用します。

* ログインして`nvidia-smi`してみる。
   ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/357766/e7a46a7a-a42c-0fa3-34bd-22d4b7d1c531.png)
 
  　ここまででログインが確認できました。

## GitHubからのリポジトリクローンと環境構築

今回は、P100を用いて以下のリポジトリの実験を行います。

https://github.com/izuna385/Entity-Linking-Tutorial

本実験についての解説は、以下のページからシリーズになっているので、当記事では説明は省略します。

https://qiita.com/izuna385/items/9d658620b9b96b0b4ec9

```
$ git clone https://github.com/izuna385/Entity-Linking-Tutorial
$ cd https://github.com/izuna385/Entity-Linking-Tutorial
$ pip3 install -r requirements.txt
```

特に問題なく進めば、以下のようにライブラリのインストールが完了する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/357766/4e9479b2-9367-46a6-186d-9b68c4f43e11.png)

## 前処理ファイルの配置(本実験のみに必要)
今回使用するリポジトリでは、いくつか前処理ファイルの配置が事前に必要です。
[README](https://github.com/izuna385/Entity-Linking-Tutorial#environment-setup) に従いファイルを配置します。

ローカルで解凍して `scp -P 14082 -r hogehoge root@8.tcp.ngrok.io:/root/Entity-Linking-Tutorial/` などとして転送しましょう。

## 実験
`python3 main.py`

* 精度を無視し、実験完了のみを一度通したい人は`python3 main.py -debug True`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/357766/4f019fad-a7ce-6a00-7fbe-21d2227ee8dc.png)

実験が走ります。自動でevaluationまで完了します。

```
dev evaluation result
recall@50 ** %
detail recall@1, @5, @10, @50 ** % ** % ** % ** %
accuracy: ** 
test evaluation result
recall@50 ** %
detail recall@1, @5, @10, @50 ** % ** % ** % ** %
```

## 本記事を書いたもう一つの背景

本記事を書いたもう一つの背景としては、In-batch trainingにおけるバッチサイズの増加で、実験の精度改善を狙いたかったからです。

P100を用いることで、訓練時のバッチサイズを16(GPU 8GB~時)から48まで増やすことが可能になります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/357766/e7efd569-cb5a-1361-dd18-6987ee4cce94.png)

In-batch trainingではバッチサイズを増加させることで、それがそのまま負例の増加につながります。結果として、より多くの負例から一つだけの正解を予測できるように、よりモデルを厳しく訓練させることになります。本実験でなぜIn-batch trainingを用いるかについては、下記を御覧ください。

https://qiita.com/izuna385/items/367b7b365a2791ee4f8e#in-batch-negative-sampling

実際にバッチサイズを16 -> 48 とすることにより、本実験では大幅に精度が向上することが確認できます。

`nohup python3 main.py -num_epochs 10 -batch_size_for_train 48 > b48.log &`

などとすることで、手軽に実験から評価までが完了します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/357766/9717bebf-9c26-4e2f-1c3c-94abcdbe432e.png)
P100をフルに使っていますね。

# まとめ
Colab-Pro を用いてsshで自然言語処理の実験を行うチュートリアルについて書きました。`requirements.txt` から環境を手軽に再現し、P100を用いた実験を行うことが出来ました。