google Colaboratoryでのデータ永続化

## はじめに

普段、jupyter notebookを利用しているのですが、google Colaboratoryが無料でGPU対応したとのことで、使ってみたいと思いいろいろ調べてみました。

## Colaboratoryとは

Googleが作ったjupyter notebookのクローン
本家と違ってめっちゃカスタマイズされていて見た目もきれい。

jupyterとの最大の違いは、コンテナで動いていて隔離されていること。

以下、詳細を調べてみました。

あんまり誰も書いてないみたいだけど、%%bashでそのセルはbashになります。

以下を実行すると一気にいろいろな情報を取得できます。

```
%%bash
echo Dockerコンテナかどうか
ls -la /.dockerenv
echo カレントディレクトリ
pwd
echo ユーザ名
whoami
echo ディストリビューション
cat /etc/issue
echo カーネル
uname -a
echo HDD
df -h
echo メモリ
free -h
echo CPU
cat /proc/cpuinfo
```

結果

```
Dockerコンテナかどうか
-rwxr-xr-x 1 root root 0 Apr  3 11:56 /.dockerenv
カレントディレクトリ
/content
ユーザ名
root
ディストリビューション
Ubuntu 17.10 \n \l

カーネル
Linux 049c85e50c68 4.4.111+ #1 SMP Tue Mar 20 22:55:39 PDT 2018 x86_64 x86_64 x86_64 GNU/Linux
HDD
Filesystem      Size  Used Avail Use% Mounted on
overlay          40G  5.0G   33G  14% /
tmpfs           6.4G     0  6.4G   0% /dev
tmpfs           6.4G     0  6.4G   0% /sys/fs/cgroup
/dev/sda1        46G  5.6G   40G  13% /etc/hosts
shm              64M     0   64M   0% /dev/shm
tmpfs           6.4G     0  6.4G   0% /sys/firmware
メモリ
              total        used        free      shared  buff/cache   available
Mem:            12G        449M        1.1G        656K         11G         12G
Swap:            0B          0B          0B
CPU
processor	: 0
vendor_id	: GenuineIntel
cpu family	: 6
model		: 63
model name	: Intel(R) Xeon(R) CPU @ 2.30GHz
stepping	: 0
microcode	: 0x1
cpu MHz		: 2300.000
cache size	: 46080 KB
physical id	: 0
siblings	: 2
core id		: 0
cpu cores	: 1
apicid		: 0
initial apicid	: 0
fpu		: yes
fpu_exception	: yes
cpuid level	: 13
wp		: yes
flags		: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ss ht syscall nx pdpe1gb rdtscp lm constant_tsc rep_good nopl xtopology nonstop_tsc eagerfpu pni pclmulqdq ssse3 fma cx16 sse4_1 sse4_2 x2apic movbe popcnt aes xsave avx f16c rdrand hypervisor lahf_lm abm kaiser fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms xsaveopt
bugs		:
bogomips	: 4600.00
clflush size	: 64
cache_alignment	: 64
address sizes	: 46 bits physical, 48 bits virtual
power management:

processor	: 1
vendor_id	: GenuineIntel
cpu family	: 6
model		: 63
model name	: Intel(R) Xeon(R) CPU @ 2.30GHz
stepping	: 0
microcode	: 0x1
cpu MHz		: 2300.000
cache size	: 46080 KB
physical id	: 0
siblings	: 2
core id		: 0
cpu cores	: 1
apicid		: 1
initial apicid	: 1
fpu		: yes
fpu_exception	: yes
cpuid level	: 13
wp		: yes
flags		: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ss ht syscall nx pdpe1gb rdtscp lm constant_tsc rep_good nopl xtopology nonstop_tsc eagerfpu pni pclmulqdq ssse3 fma cx16 sse4_1 sse4_2 x2apic movbe popcnt aes xsave avx f16c rdrand hypervisor lahf_lm abm kaiser fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms xsaveopt
bugs		:
bogomips	: 4600.00
clflush size	: 64
cache_alignment	: 64
address sizes	: 46 bits physical, 48 bits virtual
power management:
```

dockerコンテナで実行されていてかなり高スペックですね。


## 問題点

dockerで実行しているので、揮発性ストレージ。
Google driveをどこかにマウントしてくれたら使いやすいのになぁ。。。

## どうすれば？

色々調べたところ、いろいろ方法があるようですね。
 
|方法|メリット|デメリット|
|:--|:--|:--|
|curlなどでダウンロード|お手軽|書き込みができない。どこかファイル置き場を用意する必要がある。|
|git でclone|お手軽|gitに上がってないと使えない。書き込みがpushになる。|
|google-drive-ocamlfuseを使ってgoogle driveをマウント|自由に書き込み読み込みが可能|インストールが手間。セルを実行するだけでなく都度コピペが必要。|
|webdav|普通に読み書きが可能|webdavに対応しているクラウドストレージが少ない|

上の３つは結構記事もあるのですが、webdavを使った例が見当たらなかったので紹介します。

## webdavを使えるクラウドストレージ

日本製のTeraCLOUDがおすすめです。
https://teracloud.jp/ja/

無料で10GBまで利用できます。
さらに、以下の紹介コードを入力することにより合計15GBまで利用できます。
紹介コード:XM4BV
※登録後、ログインしてマイページで入力します。

マイページで、クライアント接続情報のWebDAV接続URLを確認してください。

私の場合は、https://nanao.teracloud.jp/dav/ でしたので、以下それで記述します。

## Colaboratoryでwebdavをマウント

セルに以下を入力して実行してください。

```bash
%%bash
apt-get install davfs2
mkdir /content/tera
cat << 'END' >> /etc/davfs2/secrets
https://nanao.teracloud.jp/dav/  ユーザ名  パスワード
END
mount -t davfs https://nanao.teracloud.jp/dav/ /content/tera
```

パスワードは#やスペースなどを入れる場合には"ダブルクォートでくくるか、それぞれの文字の前に\でエスケープしてください。
詳細は、/etc/davfs2/secretsに書いてあります。

## 注意点

パスワードが直接書いてあるので、この方法でマウントしたipynbファイルは公開しないでください。

## おわりに

あと、こちらが詳しいです。
https://qiita.com/tomo_makes/items/b3c60b10f7b25a0a5935

他にも試してはいませんが、S3をマウントするのもよさそうな気がします。

機械学習の環境が簡単に用意できるのでこれからもっと盛り上がっていくといいですね。