Google Colab proをVSCodeでssh接続してV100(GPU)を早速回してみた。

#はじめに
こんにちはNever$と申します。製造業でデータ分析系の業務についております(Kaggleも一応嗜んでおります)
Twitterで"VSCodeでColab-pro繋いだ~"と書いたら意外と反響がありましたのでやり方を書いてみたいと思います。参考になったと思った方は"LGTM"ボタンをポチッとお願いします。

※今回はあくまで繋いで回すまでを実験的にやってみただけですので、この記事を読んで何か不具合が発生しても自己責任でお願いします。
「ngrokつなげたら不正アクセスされた」系がもしかしたらあるかもしれませんのでご注意ください(この辺りの知識が疎いため憶測です…)

#参考サイト
・[Google Colab をSSH と VS Code で使う](https://qiita.com/hazigin/items/c291adf5dc9ccc13d11f)
丁寧に説明されていてわかりやすかったです。

#準備するもの
・Colab pro : 契約願います。
・VSCode : ローカルにインストール願います。
・[ngrok](https://ngrok.com/) : これが今回一番重要なもので、colabに接続するのに必要です。無料枠でOKですので登録願います。ググると詳しくわかります。


# 作業開始〜colab上での作業
まずはColab上で適当にNotebookを作成してください。
イメージはそこにアクセスする感じになります。

### 1 : Colab上でGPUをON, メモリをハイメモリにする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/558121/7a36824b-ccb1-ffe7-be0e-cad9369e5c76.png)

### 2 : google driveをマウントする
colabからgoogle driveを読みこむために必要なコードです。

```
from google.colab import drive
drive.mount('/content/drive')
print('Mount OK')
```

### 3 : SSH接続のためのコードを入力
この辺りは参考サイト記載内容を丸写ししております。詳細については参考先を参照願います。
1セルごとに実行してください。

```
import random, string, urllib.request, json, getpass
```

パスワードの生成

```
password = ''.join(random.choice(string.ascii_letters + string.digits) for i in range(20))
password
```

ngrokのDL

```
! wget -q -c -nc https://bin.equinox.io/c/4VmDzA7iaHb/ngrok-stable-linux-amd64.zip
! unzip -qq -n ngrok-stable-linux-amd64.zip
```


SSHの設定

```
! apt-get install -qq -o=Dpkg::Use-Pty=0 openssh-server pwgen > /dev/null
```

SSH周りの設定

```
#Set root password
! echo root:$password | chpasswd
! mkdir -p /var/run/sshd
! echo "PermitRootLogin yes" >> /etc/ssh/sshd_config
! echo "PasswordAuthentication yes" >> /etc/ssh/sshd_config
! echo "LD_LIBRARY_PATH=/usr/lib64-nvidia" >> /root/.bashrc
! echo "export LD_LIBRARY_PATH" >> /root/.bashrc
```

```
get_ipython().system_raw('/usr/sbin/sshd -D &')
```

ngrokのAPIトークンを入力

```
authtoken="API Tokenを入力"
```


```
get_ipython().system_raw('./ngrok authtoken $authtoken && ./ngrok tcp 22 &')
```

これで一旦終わり

```
with urllib.request.urlopen('http://localhost:4040/api/tunnels') as response:
  data = json.loads(response.read().decode())
  (host, port) = data['tunnels'][0]['public_url'][6:].split(':')
  print(f'SSH command: ssh -p{port} root@{host}')

print(f'Root password: {password}')
```

そうすると以下の文字が出力されます。
これは次に使いますので残しといてください。

```
SSH command: ssh -pXXXXX root@YYYYYYYY
Root password: ZZZZZZ
```


#VSCodeの設定
はじめにVSCode上の拡張機能である"Remote-SSH"を導入します。
下図赤枠のところをポチポチしてインストールしてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/558121/1d3410ff-63d1-d1c8-1e34-a5c09f8a432a.png)

#Remote-SSHの設定
colab接続用のSSH TARGETを設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/558121/1eaa67e2-2e70-628c-8064-554bed6eebeb.png)

作成したSSH TARGETを選択し歯車をクリックしてconfingをいじります。
下記のような感じで書ます。YYYYYYYYとXXXXXは前述のものです。

```
Host google_colab_ssh
	HostName YYYYYYY
	User root
	Port XXXXX
```

#SSH接続
いよいよ本番です。
該当のSSH TARGETをアクティブにして右のフォルダマーク?をクリック
上の方に選択肢が出てきますのでContinueを押して、前述のZZZZZZを入力。

そうすると入れます。
入った後は拡張機能からpythonでも入れて、Jupyter形式で開きGPUを確認してみましょう!

```
! nvidia-smi
```

![スクリーンショット 2021-03-22 23.34.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/558121/125e9a1c-ea7d-ca01-677a-0bc071512dec.png)
### V100握ってる!!!

# せっかくなので昔のコンペで使用したコードを回してみる。
左のOpen Folderからdriveを開きます。
Pathは"/content/drive/MyDrive/~"以下個人の環境になります。

![スクリーンショット 2021-03-22 23.59.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/558121/0dc0f2f4-db27-0157-d65e-f9a66cd462f9.png)
### ちゃんと自分のコード上でもV100握ってる!!!(V100やたらと出るな笑)


テーブルデータで学習開始!(MoAコンペのResNetいじったやつです)
体感ではめっちゃ早くなってる気がします。
![スクリーンショット 2021-03-23 0.02.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/558121/e530771e-a470-7adc-61ff-89a2414c918e.png)

# 終わりに
VSCodeとColab proの連携は以上となります。
駆け足で作成したため、多少説明が不足している点があると思いますがご了承ください。
私自身もまだ理解していない点が多数ありますので引き続き環境構築に注力したいと思います。

最後まで読んでいただきありがとうございました。