Google ColaboratoryをGoogle DriveにマウントしてPythonを実行する。


Googleが無料提供している、オンラインJupyter Notebook環境、[Google Colaboratory](https://colab.research.google.com/notebooks/welcome.ipynb?hl=ja)。

> Colaboratory は、完全にクラウドで実行される Jupyter ノートブック環境です。設定不要で、無料でご利用になれます。
Colaboratory を使用すると、コードの記述と実行、解析の保存や共有、強力なコンピューティング リソースへのアクセスなどをブラウザからすべて無料で行えます

Google Driveにマウントして、まるで**Google DriveにUbuntuのシェルがついたように扱える**ので便利です。

![2019-05-07_18.35.01.png](https://cdn.discordapp.com/attachments/575215439257403392/575254326575104012/2019-05-07_18.35.01.png)

```
（´-`）.｡oO（表示が崩れていますが…）
```

Pythonを実行して、実行結果のファイルなどをGoogle Driveに保存する使い方をよくしているので、知見をまとめました。(Python以外の言語も実行できます。)
## 1. ルールと使い方
完全無料で使えるGoogle Colaboratoryですが、俗に**12時間ルール**と**90分ルール**と呼ばれる使用上の制限があります。これはBitcoin採掘やBotなど、一般的なモラルに反した利用を制限するためのものです。下の、秒速Colabの記事がわかりやすいので参照してください。また、基本的な使い方も書いてあります。

> [【秒速で無料GPUを使う】TensorFow(Keras)/PyTorch/Chainer環境構築 on Colaboratory](https://qiita.com/tomo_makes/items/f70fe48c428d3a61e131)



## 2. Pythonのスクリプトを実行する方法
上記事を参照した上で
### Google Driveのマウント
1. Google Driveをマウントする

```python
from google.colab import drive 
drive.mount('/content/drive')
```
出力されるリンク先でGoogleアカウントにログインして、トークンをColabの入力を受け付けている部分にコピペしてください。Google Driveがマウントされます。

![2019-05-07_21.07.32.png](https://cdn.discordapp.com/attachments/575215439257403392/575332378738950145/2019-05-07_21.07.32.png)
2. Google Drive上のフォルダに移動する

```
%cd "drive/My Drive/（任意のフォルダ）"
```

cdは`%`を付けるあるいは付けません。lsなどは`!`でも`%`でも付けなくても動きます。これはJupyterのバックエンドであるIpython側の仕様が

```
%lsmagic
```
> Available line magics:
%alias  %alias_magic  %autocall  %automagic  %autosave  %bookmark  %cat  %cd  %clear  %colors  %config  %connect_info  %cp  %debug  %dhist  %dirs  %doctest_mode  %ed  %edit  %env  %gui  %hist  %history  %killbgscripts  %ldir  %less  %lf  %lk  %ll  %load  %load_ext  %loadpy  %logoff  %logon  %logstart  %logstate  %logstop  %ls  %lsmagic  %lx  %macro  %magic  %man  %matplotlib  %mkdir  %more  %mv  %notebook  %page  %pastebin  %pdb  %pdef  %pdoc  %pfile  %pinfo  %pinfo2  %pip  %popd  %pprint  %precision  %profile  %prun  %psearch  %psource  %pushd  %pwd  %pycat  %pylab  %qtconsole  %quickref  %recall  %rehashx  %reload_ext  %rep  %rerun  %reset  %reset_selective  %rm  %rmdir  %run  %save  %sc  %set_env  %shell  %store  %sx  %system  %tb  %time  %timeit  %unalias  %unload_ext  %who  %who_ls  %whos  %xdel  %xmode

> Available cell magics:
%%!  %%HTML  %%SVG  %%bash  %%bigquery  %%capture  %%debug  %%file  %%html  %%javascript  %%js  %%latex  %%perl  %%prun  %%pypy  %%python  %%python2  %%python3  %%ruby  %%script  %%sh  %%shell  %%svg  %%sx  %%system  %%time  %%timeit  %%writefile

>> [Jupyter Notebookでマジックコマンド一覧を確認する%lsmagic \| note.nkmk.me](https://note.nkmk.me/jupyter-notebook-ipython-lsmagic/)
> Automagic is ON, % prefix IS NOT needed for line magics.


なるmagicコマンドを用意しているのと、Colab特有の`!`でBashシェルコマンドがあるためのようです。　

`cd`が`!`で動かないのは`!cd`はサブプロセスでcdした結果が返り値になってるだけで今のプロセスには適用されてないためと考えられます。同じチームの、[@2-propanol](https://qiita.com/2-propanol)さんが記事を書いてくれました。

> [Jupyter Notebook における「%run hoge.py」と「!python hoge.py」の違い](https://qiita.com/2-propanol/items/f6f63c3f20981df2c844)

`!ls`は「結果の表示」が目的のコマンドなので、結果的にどちらでも動くと考えています。



ですので、Bashシェルコマンドを使いたい場合は `!` 、`cd` を使う場合は `%` または何も付けないで実行という使い分けになると思います。

> Besides %cd, other available shell-like magic functions are %cat, %cp, %env, %ls, %man, %mkdir, %more, %mv, %pwd, %rm, and %rmdir, any of which can be used without the % sign if automagic is on.
> > [IPython-And-Shell-Commands](https://colab.research.google.com/github/jakevdp/PythonDataScienceHandbook/blob/master/notebooks/01.05-IPython-And-Shell-Commands.ipynb)

Ubuntuのシェルが動いているため、

```
!apt-get install screenfetch
```

```
!screenfetch
```
![2019-05-07_18.35.01.png](https://cdn.discordapp.com/attachments/575215439257403392/575254326575104012/2019-05-07_18.35.01.png)

```
!apt-get install neofetch
```
```
!neofetch
```

![2019-05-07_18.36.21.png](https://cdn.discordapp.com/attachments/575215439257403392/575254642662047754/2019-05-07_18.36.21.png)

などできます。なお、12時間でランタイムがリセットされるため、次回にマウントしたときは、デフォルトでinstallされているパッケージ以外はinstallする必要があります。
### Colabで.pyファイルを実行する
コードセルで

```
%run hogehoge.py
```
あるいは

```
!python hogehoge.py
```
をshift+Enterで実行できます。

## 3. 地味に使いにくい仕様
### Google ColaboratoryとGoogle Driveが同期されるのに時間がかかるところ
例えば、Colaboratory側からフォルダをリムーブしても、Google Driveに反映されるのに約2分かかります。プログラムで連続してファイル/フォルダ操作する場合は注意が必要です。重複ファイルと見なされて、名前を勝手に変更される場合があります。
### I/Oが弱いところ
画像ファイルなどデータセットが数千から数万ファイルになることはよくあることだと思うのですが、
> drive.mount() が失敗して「タイムアウト」と表示されることがあるのはどうしてですか。また、drive.mount() でマウントしたフォルダでの I/O オペレーションが失敗することがあるのはどうしてですか。
>>Google ドライブのオペレーションは、フォルダ内のファイル数やサブフォルダ数が増えすぎるとタイムアウトすることがあります。数千件ものアイテムが最上位の「マイドライブ」フォルダの直下にあると、ドライブのマウント処理がタイムアウトする可能性が高くなります。マウントを繰り返し試みると最終的に成功することがあります。これは、タイムアウトするまで、失敗するたびに部分的な状態がローカルのキャッシュに保存されるためです。この問題が発生した場合は、「マイドライブ」の直下にあるファイルやフォルダをサブフォルダに移動してみてください。drive.mount() が正常終了した後で他のフォルダから読み取りを行うと、同様の問題が発生することがあります。多くのアイテムが含まれているフォルダ内のアイテムにアクセスすると、OSError: [Errno 5] Input/output error（python 3）または IOError: [Errno 5] Input/output error（python 2）のようなエラーが発生することがあります。この問題も同様に、直下にあるアイテムをサブフォルダに移動することで解決できます。
注: ファイルやサブフォルダをゴミ箱に移動して「削除」するだけでは、この問題を解決できないことがあります。この方法で解決できない場合は、ゴミ箱を空にしてください。
> >>[Colaboratory – Google](https://research.google.com/colaboratory/faq.html#drive-timeout)
 
といったI/Oのエラーがマウント時や、プログラム実行時に発生することがあります。数回実行すると成功するので、I/Oが弱いということを知っておく必要があります。

> [Google Colaboratory で機械学習させる際のインフラ整備](https://qiita.com/iZuno-K/items/453cbc023a477359f272)

このリンクに定期的にゴミ箱を空にするGASがあるので参照してください。
#### マウント時のエラー

```
Enter your authorization code:
··········
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-2-3b8a479202a4> in <module>()
----> 1 drive.mount('/content/drive')

/usr/local/lib/python3.6/dist-packages/google/colab/drive.py in mount(mountpoint, force_remount, timeout_ms)
    178             ': timeout during initial read of root folder; for more info: '
    179             'https://research.google.com/colaboratory/faq.html#drive-timeout%27)
--> 180       raise ValueError('mount failed' + extra_reason)
    181     elif case == 2:
    182       # Not already authorized, so do the authorization dance.

ValueError: mount failed: timeout during initial read of root folder; for more info: https://research.google.com/colaboratory/faq.html#drive-timeout
```
#### ファイルを読み取るプログラムを実行したときのエラー
```
OSError: [Errno 5] Input/output error:
```

どちらのエラーも数回実行すると通ります。

### 長時間連続利用時のペナルティ
私は経験がないのですが、[kaggler-ja](http://yutori-datascience.hatenablog.com/entry/2017/08/23/143146)の[19/5/5のスレッド](https://kaggler-ja.slack.com/archives/C6RV8M3DG/p1557045765394400)によると連続で毎日12時間ランタイムを利用すると、リソース不足による利用制限があるそうです。
## (おまけ)19/04/29時点でのスペック
```
!nvidia-smi
```
GPUが新しくなった(Tesla K80→Tesla T4)ので、秒速Colabの記事から変わった部分だけ書いておきます。(19/4/29)
```
>Mon Apr 29 01:01:43 2019       
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 418.56       Driver Version: 410.79       CUDA Version: 10.0     |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|===============================+======================+======================|
|   0  Tesla T4            Off  | 00000000:00:04.0 Off |                    0 |
| N/A   73C    P0    32W /  70W |      0MiB / 15079MiB |      0%      Default |
+-------------------------------+----------------------+----------------------+                                                                               
+-----------------------------------------------------------------------------+
| Processes:                                                       GPU Memory |
|  GPU       PID   Type   Process name                             Usage      |
|=============================================================================|
|  No running processes found                                                 |
+-----------------------------------------------------------------------------+
```

このような出力があり、[Tesla T4](https://www.google.com/search?q=tesla+t4&oq=Tesla+&aqs=chrome.1.69i57j69i59j69i60l2j69i61j0.2833j0j1&sourceid=chrome&ie=UTF-8) というGPUが現在利用できることがわかります。

```
!cat /etc/issue
```
> Ubuntu 18.04.2 LTS \n \l
 
```
!df -h
```
```
Filesystem      Size  Used Avail Use% Mounted on
overlay         359G   25G  316G   8% /
tmpfs           6.4G     0  6.4G   0% /dev
tmpfs           6.4G     0  6.4G   0% /sys/fs/cgroup
tmpfs           6.4G   12K  6.4G   1% /var/colab
/dev/sda1       365G   29G  337G   8% /opt/bin
shm             6.0G  4.0K  6.0G   1% /dev/shm
tmpfs           6.4G     0  6.4G   0% /sys/firmware
drive            15G   13G  2.6G  83% /content/drive
```

```
!free -h
```
>                             total        used        free      shared  buff/cache   available
>             Mem:            12G        520M         9.3G        916K        3.0G         11G
>             Swap:            0B          0B          0B

```
!cat /proc/cpuinfo
```
```
processor	: 0
vendor_id	: GenuineIntel
cpu family	: 6
model		: 79
model name	: Intel(R) Xeon(R) CPU @ 2.20GHz
stepping	: 0
microcode	: 0x1
cpu MHz		: 2200.000
cache size	: 56320 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 cpuid tsc_known_freq pni pclmulqdq ssse3 fma cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt aes xsave avx f16c rdrand hypervisor lahf_lm abm 3dnowprefetch invpcid_single pti ssbd ibrs ibpb stibp fsgsbase tsc_adjust bmi1 hle avx2 smep bmi2 erms invpcid rtm rdseed adx smap xsaveopt arat arch_capabilities
bugs		: cpu_meltdown spectre_v1 spectre_v2 spec_store_bypass l1tf
bogomips	: 4400.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		: 79
model name	: Intel(R) Xeon(R) CPU @ 2.20GHz
stepping	: 0
microcode	: 0x1
cpu MHz		: 2200.000
cache size	: 56320 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 cpuid tsc_known_freq pni pclmulqdq ssse3 fma cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt aes xsave avx f16c rdrand hypervisor lahf_lm abm 3dnowprefetch invpcid_single pti ssbd ibrs ibpb stibp fsgsbase tsc_adjust bmi1 hle avx2 smep bmi2 erms invpcid rtm rdseed adx smap xsaveopt arat arch_capabilities
bugs		: cpu_meltdown spectre_v1 spectre_v2 spec_store_bypass l1tf
bogomips	: 4400.00
clflush size	: 64
cache_alignment	: 64
address sizes	: 46 bits physical, 48 bits virtual
power management:
```

```
!cat /proc/driver/nvidia/gpus/0000:00:04.0/information
```
```
Model: 		 Tesla T4
IRQ:   		 11
GPU UUID: 	 GPU-d674dfb0-17a0-1298-4f54-da7ee0624fb3
Video BIOS: 	 90.04.21.00.01
Bus Type: 	 PCI
DMA Size: 	 47 bits
DMA Mask: 	 0x7fffffffffff
Bus Location: 	 0000:00:04.0
Device Minor: 	 0
Blacklisted:	 No

```