Python
Ubuntu
T4
colaboratory

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

Googleが無料提供している、オンラインJupyter Notebook環境、Google Colaboratory


Colaboratory は、完全にクラウドで実行される Jupyter ノートブック環境です。設定不要で、無料でご利用になれます。

Colaboratory を使用すると、コードの記述と実行、解析の保存や共有、強力なコンピューティング リソースへのアクセスなどをブラウザからすべて無料で行えます


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

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



2. Pythonのスクリプトを実行する方法

上記事を参照した上で


Google Driveのマウント


  1. Google Driveをマウントする

from google.colab import drive 

drive.mount('/content/drive')

出力されるリンク先でGoogleアカウントにログインして、トークンをColabの入力を受け付けている部分にコピペしてください。Google Driveがマウントされます。

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

Automagic is ON, % prefix IS NOT needed for line magics.



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

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


Jupyter Notebook における「%run hoge.py」と「!python hoge.py」の違い


!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



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

!apt-get install screenfetch

!screenfetch

2019-05-07_18.35.01.png

!apt-get install neofetch

!neofetch

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




といったI/Oのエラーがマウント時や、プログラム実行時に発生することがあります。数回実行すると成功するので、I/Oが弱いということを知っておく必要があります。


Google Colaboratory で機械学習させる際のインフラ整備


このリンクに定期的にゴミ箱を空にする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-ja19/5/5のスレッドによると連続で毎日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 という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