Google Colaboratoryを使ってみた

Google Colaboratoryを使ってみた

今年はじめに以下のようなニュースがでていました。気にはなっていたのですが試す時間がなかったので試してみました。 Google Colaboratoryが正しいのかGoogle Colabが正しいのか…

控えめに言ってもすごすぎ。その他のプラットフォームを殺すつもりできてるのかと思いました。

以下に説明というか、FAQページのリンクを貼っておきます。

Colaboratory – Google

簡単に説明すると、ChromeなどのブラウザからJupyter Notebook環境を使えて、更にGPUリソースが使えるという優れものでした。 もう、初学者はanacondaもインストールせずこれ一択でいいと思います。

このエントリーは

qiita.com

を参考に作成しています。

とりあえず使ってみる

とりあえず、使用してみましょう。インストールも何もいりません。Googleアカウントだけは必要でなので事前にログオンはしておきましょう。 以下のURLにアクセスすれば準備OKです。

Colaboratory – Google

アクセスすると以下のような画面になると思います。

f:id:ueponx:20180319233415j:plain

おめでとうございます!これでJupyter Notebook環境が使えることになりました!インストールばっかりしている自分にとってはこれはあまりにも衝撃的ですが、目的はインストールすることではないはずのでこれが理想的な姿だと思います。

ダイアログの下のほうにある【ノートブックの新規作成】をクリックします。

f:id:ueponx:20180319233912j:plain

すると、プルダウンで【PYTHON2の新しいノートブック】と【PYTHON3の新しいノートブック】が表示されます。もうPythonはVersion3でやっていきましょう!(今年の目標)

f:id:ueponx:20180319234142j:plain

【PYTHON3の新しいノートブック】を選びます。これだけでほぼ準備完了です。あとはpythonのコードを打ち込っていけばいいのです。 コードは画面内の入力ボックスに記入します。環境としてはJupyter NotebookなのでREPLの様に改行をしても実行はされません。

f:id:ueponx:20180319234732j:plain

打ち込んだコードを実行するには【Shift + Enter】または左側の再生ボタン(実行ボタン?)になります。まずは、Hello Worldを画面内に表示してみます。コードを行のところに

print('Hello World')

f:id:ueponx:20180320001208j:plain

と入力し、実行(【Shift + Enter】)してみます。以下の様に出力されます。 初回の実行にはインスタンスへの接続が行われるため時間はかかりますが、それ以降ではサクサクと実行されるのでご安心を。

実行中は下記のように表示が読み込み中のような表示になります。

f:id:ueponx:20180320001232j:plain

【実行結果】

Hello World

f:id:ueponx:20180320001249j:plain

実行は成功です。 続いてもう少しコードを書いてみます。今日の日付を出力するのですが、datetimeモジュールをimportをしている点が先程と違います。

import datetime

today = datetime.date.today()
print(today)

これを実行すると以下の様になります。

f:id:ueponx:20180320001500p:plain

通常のpythonの開発も問題なさそうですね。OSモジュールなども正常にインストールできていました。

あとはノートブックを保存してみましょう。作成時には【Untitled**.ipynb】というような名前でノートブックが作成されますのでブラウザの左上の名前の部分を編集します。

f:id:ueponx:20180320002128j:plain

今回は【sample.ipynb】という名前に変更してみました。入力ボックスに名前を入れれば作業は完了するのですが、保存されているのはgoogle colabの環境化になります。実際にはGoogleDriveに保存しておくのが普通だと思いますので、そちらに保存します。

f:id:ueponx:20180320002420j:plain

f:id:ueponx:20180320002727j:plain

メニューバーから【ファイル】→【保存】を選択します。

f:id:ueponx:20180320002828j:plain

すると自分のGoogleDriveのマイドライブに【Colab Notebooks】というフォルダが作成(すでにあれば再作成はされません)され先程つけた名前のipynbファイルが保存されます。これを読み込めば同じ状態から作業を始めることができるようになります。

f:id:ueponx:20180320002950j:plain

接続するインスタンスを調べてみる

先程、pythonの初回実行時にはインスタンスに接続することでpythonのプログラムが実行されるという話をしました。ではこのインスタンスに直接アクセスすることはできるのでしょうか。コマンド行にの先頭に!をいれてshコマンドを入れると実行することができるようです。

いろいろネットを調べてみるとこのインスタンス強力すぎます。

  • Ubuntu 17.10
  • n1-highmem-2 instance
  • 2vCPU @ 2.2GHz
  • 13GB RAM
  • 40GB Free Space
  • GPU NVIDIA Tesla K80

*1 90分間なにもしないとインスタンスはシャットダウンします。また、最大でも12時間しか使用できません。

上記のK80を無料で使えるのはすごい!(間違ってる?)ただ、通常に起動した場合にはGPUはOFFになっています。既に作成したnodebookでGPUをONにするには以下の作業が必要になります。

メニューバーから【ランタイム】→【ランタイムのタイプを変更】を選択します。

f:id:ueponx:20180320005852j:plain

すると以下のようなダイアログが表示されますので、【ハードウエアアクセラレータ】のプルダウン【None】から【GPU】に変更します。念のため【このノートブックを保持する際にコードセルの出力を除外する】にチェックをを付けておきます。設定が終わったら【保存】ボタンをクリックします。

f:id:ueponx:20180320005855j:plain

ページ再読み込みのダイアログが出ますので、ここも【再読み込み】ボタンをクリックします。

f:id:ueponx:20180320005858j:plain

これでGPUが有効になります。

f:id:ueponx:20180320005901j:plain

見た目にはほとんど変化はありませんが、先ほど実行したコードの実行結果が消えています。

f:id:ueponx:20180320010014j:plain

ではGPUがONになっているかを確認してみます。 確認方法はtensorflow経由となりますが、以下のようなコードで確認できます。

import tensorflow as tf
tf.test.gpu_device_name()

【実行結果:GPU設定あり】

'/device:GPU:0'

f:id:ueponx:20180320122650p:plain

問題なさそうです。

ちなみにGPUがNoneの場合には以下のような結果になります。

【実行結果:GPU設定なし】

''

f:id:ueponx:20180320123451p:plain

あとはpythonのバージョンなどを調べてみましょう。最初に言っていたインスタンスのshコマンドを実行する場合には冒頭に!をつけて実行を行います。 pythonのバージョンを調べるときにはpython --versionと打込むので、今回は以下のように入力します。

!python --version

【実行結果】

Python 3.6.3

f:id:ueponx:20180320124219p:plain

ということで、更にインスタンスのハードウエアスペックを見てみます。

!cat /proc/cpuinfo

【実行結果】

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 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 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:

f:id:ueponx:20180320010028j:plain

CPUがXeonなのか…

それではGPUの情報は…

!cat /proc/driver/nvidia/gpus/0000:00:04.0/information

【実行結果】

Model:          Tesla K80
IRQ:         33
GPU UUID:    GPU-9743217b-7464-7627-8efc-0f60f5217deb
Video BIOS:      80.21.25.00.01
Bus Type:    PCI
DMA Size:    40 bits
DMA Mask:    0xffffffffff
Bus Location:    0000:00:04.0
Device Minor:    0

情報通りのTesla K80すげー!

f:id:ueponx:20180320010046j:plain

では、pythonのパッケージpip経由で見てみます。

!pip freeze

【実行結果】

absl-py==0.1.11
astor==0.6.2
beautifulsoup4==4.6.0
bleach==1.5.0
cachetools==2.0.1
certifi==2018.1.18
chardet==3.0.4
crcmod==1.7
cycler==0.10.0
decorator==4.2.1
dill==0.2.7.1
entrypoints==0.2.3
future==0.15.2
futures==3.0.5
gapic-google-cloud-datastore-v1==0.15.3
gapic-google-cloud-error-reporting-v1beta1==0.15.3
gapic-google-cloud-logging-v2==0.91.3
gast==0.2.0
google-api-core==0.1.4
google-api-python-client==1.6.5
google-auth==1.3.0
google-auth-httplib2==0.0.3
google-auth-oauthlib==0.2.0
google-cloud==0.32.0
google-cloud-bigquery==0.30.0
google-cloud-bigquery-datatransfer==0.1.1
google-cloud-bigtable==0.28.1
google-cloud-container==0.1.1
google-cloud-core==0.28.1
google-cloud-datastore==1.4.0
google-cloud-dns==0.28.0
google-cloud-error-reporting==0.28.0
google-cloud-firestore==0.28.0
google-cloud-language==1.0.1
google-cloud-logging==1.4.0
google-cloud-monitoring==0.28.1
google-cloud-pubsub==0.30.1
google-cloud-resource-manager==0.28.1
google-cloud-runtimeconfig==0.28.1
google-cloud-spanner==0.29.0
google-cloud-speech==0.30.0
google-cloud-storage==1.6.0
google-cloud-trace==0.17.0
google-cloud-translate==1.3.1
google-cloud-videointelligence==1.0.1
google-cloud-vision==0.29.0
google-colab==0.0.1a1
google-gax==0.15.16
google-resumable-media==0.3.1
googleapis-common-protos==1.5.3
grpc-google-iam-v1==0.11.4
grpcio==1.10.0
h5py==2.7.1
html5lib==0.9999999
httplib2==0.10.3
idna==2.6
ipykernel==4.6.1
ipython==5.5.0
ipython-genutils==0.2.0
Jinja2==2.8
jsonschema==2.5.1
jupyter-client==5.2.3
jupyter-core==4.4.0
Keras==2.1.5
Markdown==2.6.11
MarkupSafe==1.0
matplotlib==2.1.2
mistune==0.8.3
mpmath==1.0.0
nbconvert==5.3.1
nbformat==4.4.0
networkx==2.1
nltk==3.2.1
notebook==5.2.2
numpy==1.14.2
oauth2client==4.1.2
oauthlib==2.0.6
olefile==0.45.1
opencv-python==3.4.0.12
pandas==0.22.0
pandas-gbq==0.3.1
pandocfilters==1.3.0
patsy==0.5.0
pexpect==4.4.0
pickleshare==0.7.4
Pillow==4.0.0
plotly==1.12.12
ply==3.8
portpicker==1.2.0
prompt-toolkit==1.0.15
proto-google-cloud-datastore-v1==0.90.4
proto-google-cloud-error-reporting-v1beta1==0.15.3
proto-google-cloud-logging-v2==0.91.3
protobuf==3.5.2
psutil==4.3.1
ptyprocess==0.5.2
pyasn1==0.4.2
pyasn1-modules==0.2.1
Pygments==2.1.3
pyparsing==2.2.0
python-dateutil==2.5.3
pytz==2016.7
PyWavelets==0.5.2
PyYAML==3.11
pyzmq==16.0.4
requests==2.18.4
requests-oauthlib==0.8.0
rsa==3.4.2
scikit-image==0.13.1
scikit-learn==0.19.1
scipy==0.19.1
seaborn==0.7.1
simplegeneric==0.8.1
six==1.11.0
statsmodels==0.8.0
sympy==1.1.1
tensorboard==1.6.0
tensorflow==1.6.0
termcolor==1.1.0
terminado==0.8.1
testpath==0.3.1
tornado==4.5.3
traitlets==4.3.2
uritemplate==3.0.0
urllib3==1.22
wcwidth==0.1.7
webencodings==0.5.1
Werkzeug==0.14.1
xgboost==0.7.post3

f:id:ueponx:20180320010048j:plain

おお! ネットの情報ではkeraspipで別途インストールという情報でしたが、既にデフォルト状態でインストールされている用です。最高! 使いそうなモジュールのバージョンを実行してみました。(2018/03/19現在)

f:id:ueponx:20180320010055j:plain

OpenCVは3系、tensorflowも1.6と新しく、kerasも2系と素晴らしい!

念のため、TensorflowでHello Worldもしてみました!

f:id:ueponx:20180320125729p:plain

問題ないようです。

おわりに

今後のAI関連の環境としてはこちらが定番になりそうです。環境などの構築にかける時間も不要なので、本来の目的へストレートに進めればいいのだと思います。

後は画像処理などを考えるとGoogleDriveとの連携などがわかるといいのかもしれません。

とはいえ、これまで機種依存などがあり勉強会などでもかなり苦労していた部分のほとんどが解消されるかなと思います。

関連エントリー

uepon.hatenadiary.com uepon.hatenadiary.com

*1:90分間なにもしないとインスタンスはシャットダウンします。また、最大でも12時間しか使用できません。