DeepLearning
Keras
TensorFlow
PyTorch
colaboratory

【秒速で無料GPUを使う】TensorfFow/Keras/PyTorch/Chainer環境構築 on Colaboratory

PR: 「秒速DEEP LEARNING -Colaboratoryで入門〜応用ひとっ飛び-」 BOOTHでのダウンロード販売を開始、おかげさまで600部を超えました。

注記(18/9/24) 1月の公開後Tensorflow本体にKerasが統合されるなど、状況が変化しています。最新の情報を加筆予定ですのでしばらくお待ちください。

TL;DR

  • Google Colabで新たに無料でGPU環境が使えるようになった
    • K80, 連続12hr利用可能
  • お金も構築時間もショートカット
    • クラウドで自分でGPUインスタンス借りて構築しなくていい
    • GPUパソコン組み立てなくてもいい
  • 下記代表的なフレームワークが動かせる
    • TensorFlow
    • Keras
    • PyTorch
    • Chainer
  • ちょっとしたhands onをやったりするのに最適
  • 実践時のTipsをまとめました - 【秒速で無料GPUを使う】深層学習実践Tips on Colaboratory - Qiita

はじめに

Google Colabで、【無料で】FreeでK80相当GPUを1回12hrまで使えるっていうすばらしいtweetが流れてきた。

クラウドでGPUインスタンス借りなくてもいいし、最初からGPUパソコン組み立てなくてもいい。お金も構築時間もショートカットできる。

初学者のハードルがめちゃ下がる。すばらしい。なので軽いTutorialを書く。

前提

割当てリソース

などを参考に、colaboratoryの提供環境は下記の通り(20181016更新):

  • n1-highmem-2 instance
  • Ubuntu 18.04
  • 2vCPU @ 2.2GHz
  • 13GB RAM
  • (GPUなし/ TPU)40GB, (GPUあり)360GB Storage
  • GPU NVIDIA Tesla K80 12GB
  • アイドル状態が90分続くと停止
  • 連続使用は最大12時間
  • Notebookサイズは最大20MB

雑感としては:

  • それなりのサイズのdatasetをdisk上に持ってこれる
  • RAMはそんなにないので、Pythonのarrayでメモリ上に持っておく量は加減が必要
    • epochで使うdatasetが大量ならbatch毎に読み込むとか
  • tutorialとかをこなすには十分

という感じ。

!cat /etc/issue

Ubuntu 18.04.1 LTS \n \l

!df -h (GPUありでの例)

Filesystem      Size  Used Avail Use% Mounted on
overlay         359G  9.4G  331G   3% /
...

free -h

              total        used        free      shared  buff/cache   available
Mem:            12G        391M        6.6G        828K        5.7G         12G
Swap:            0B          0B          0B

!cat /proc/cpuinfo (GPUありでの例)

processor   : 0
...
model name  : Intel(R) Xeon(R) CPU @ 2.20GHz
...
cpu MHz     : 2200.000
cache size  : 56320 KB
...

processor   : 1
...
model name  : Intel(R) Xeon(R) CPU @ 2.20GHz
...
cpu MHz     : 2200.000
cache size  : 56320 KB
...

!cat /proc/driver/nvidia/gpus/0000:00:04.0/information  (GPUありでの例)

Model:       Tesla K80
IRQ:         33
...
from tensorflow.python.client import device_lib
device_lib.list_local_devices()

[name: "/device:CPU:0"
 device_type: "CPU"
 memory_limit: 268435456
 locality {
 }
 incarnation: 14142945018355836735, name: "/device:GPU:0"
 device_type: "GPU"
 memory_limit: 358416384
 locality {
   bus_id: 1
 }
 incarnation: 7915847976140889213
 physical_device_desc: "device: 0, name: Tesla K80, pci bus id: 0000:00:04.0, compute capability: 3.7"]

試し方

Google Colabを開く

https://colab.research.google.com/

新規ノートブックを作成

ノートブックを新規作成 > Python3の新しいノートブック を選ぶ。

GPUをアサイン

  • 画面上部のメニュー ランタイム > ランタイムのタイプを変更 で、 ノートブックの設定 を開く
  • ハードウェアアクセラレータに GPU を選択し、 保存 する

GPUが正しくアサインされたか確認

  • [+]コード から、コード入力用のセルを追加する
  • セルに下記を入力
import tensorflow as tf
tf.test.gpu_device_name()
  • 下記が出力されると、正しくGPUがアサインされている
'/device:GPU:0'

結構ColabでGPU、がバズっているのでbackend GPUが足りないとエラーになることもあるらしい

TensorFlow

環境準備

不要、すぐ使える。

CPU/GPUのパフォーマンスを比較

畳み込みをCPUとGPUで比較する下記コードを実行する。同様にコード入力用セルを追加し、コードを貼り付け、実行する。

https://www.kaggle.com/getting-started/47096#post271139 より引用

import tensorflow as tf
import timeit

# See https://www.tensorflow.org/tutorials/using_gpu#allowing_gpu_memory_growth
config = tf.ConfigProto()
config.gpu_options.allow_growth = True

with tf.device('/cpu:0'):
  random_image_cpu = tf.random_normal((100, 100, 100, 3))
  net_cpu = tf.layers.conv2d(random_image_cpu, 32, 7)
  net_cpu = tf.reduce_sum(net_cpu)

with tf.device('/gpu:0'):
  random_image_gpu = tf.random_normal((100, 100, 100, 3))
  net_gpu = tf.layers.conv2d(random_image_gpu, 32, 7)
  net_gpu = tf.reduce_sum(net_gpu)

sess = tf.Session(config=config)

# Test execution once to detect errors early.
try:
  sess.run(tf.global_variables_initializer())
except tf.errors.InvalidArgumentError:
  print(
      '\n\nThis error most likely means that this notebook is not '
      'configured to use a GPU.  Change this in Notebook Settings via the '
      'command palette (cmd/ctrl-shift-P) or the Edit menu.\n\n')
  raise

def cpu():
  sess.run(net_cpu)

def gpu():
  sess.run(net_gpu)

# Runs the op several times.
print('Time (s) to convolve 32x7x7x3 filter over random 100x100x100x3 images '
      '(batch x height x width x channel). Sum of ten runs.')
print('CPU (s):')
cpu_time = timeit.timeit('cpu()', number=10, setup="from __main__ import cpu")
print(cpu_time)
print('GPU (s):')
gpu_time = timeit.timeit('gpu()', number=10, setup="from __main__ import gpu")
print(gpu_time)
print('GPU speedup over CPU: {}x'.format(int(cpu_time/gpu_time)))

sess.close()

下記のような結果が得られる。GPUで、9倍速かったって。

Time (s) to convolve 32x7x7x3 filter over random 100x100x100x3 images (batch x height x width x channel). Sum of ten runs.
CPU (s):
8.584801190000007
GPU (s):
0.8974968620000254
GPU speedup over CPU: 9x

Keras

環境準備

いきなり from keras.datasets import mnist しようとすると怒られる。下記を新規コードセルで実行し、Kerasをinstallする。

!pip install -q keras
import keras

下記出力が得られたら正しくinstallされている。

Using TensorFlow backend.

MNISTデータセットの準備

実際に学習まで試す。例のMNIST CNNチュートリアルを、Keras on Tensorflowでやってみる。
Keras MNISTをCNNで推定するサンプルコードを使う。

データセットの準備

Kerasには、簡単にMNISTほかのデータセットを読み込める関数が用意されている。それを使ってデータセットを読み込む。

from keras.datasets import mnist
mnist.load_data()

下記出力が得られる。

Downloading data from https://s3.amazonaws.com/img-datasets/mnist.npz
11493376/11490434 [==============================] - 1s 0us/step
((array([[[0, 0, 0, ..., 0, 0, 0],
          [0, 0, 0, ..., 0, 0, 0],
          [0, 0, 0, ..., 0, 0, 0],
(以下略)

学習コードの実行

下記のような結果が10分以内に得られる。

x_train shape: (60000, 28, 28, 1)
60000 train samples
10000 test samples
Train on 60000 samples, validate on 10000 samples
Epoch 1/12
60000/60000 [==============================] - 12s 196us/step - loss: 0.2861 - acc: 0.9113 - val_loss: 0.0566 - val_acc: 0.9808
Epoch 2/12
60000/60000 [==============================] - 11s 186us/step - loss: 0.0913 - acc: 0.9738 - val_loss: 0.0441 - val_acc: 0.9856
Epoch 3/12
 4736/60000 [=>............................] - ETA: 9s - loss: 0.0688 - acc: 0.978560000/60000 [==============================] - 11s 186us/step - loss: 0.0660 - acc: 0.9801 - val_loss: 0.0355 - val_acc: 0.9866
Epoch 4/12
60000/60000 [==============================] - 11s 187us/step - loss: 0.0549 - acc: 0.9839 - val_loss: 0.0321 - val_acc: 0.9894
Epoch 5/12
51968/60000 [========================>.....] - ETA: 1s - loss: 0.0457 - acc: 0.985860000/60000 [==============================] - 11s 186us/step - loss: 0.0463 - acc: 0.9856 - val_loss: 0.0276 - val_acc: 0.9904
Epoch 6/12
60000/60000 [==============================] - 11s 188us/step - loss: 0.0409 - acc: 0.9876 - val_loss: 0.0352 - val_acc: 0.9880
Epoch 7/12
60000/60000 [==============================] - 11s 187us/step - loss: 0.0379 - acc: 0.9884 - val_loss: 0.0329 - val_acc: 0.9882
Epoch 8/12
 1664/60000 [..............................] - ETA: 10s - loss: 0.0193 - acc: 0.993460000/60000 [==============================] - 11s 188us/step - loss: 0.0326 - acc: 0.9902 - val_loss: 0.0317 - val_acc: 0.9897
Epoch 9/12
60000/60000 [==============================] - 11s 186us/step - loss: 0.0328 - acc: 0.9902 - val_loss: 0.0271 - val_acc: 0.9912
Epoch 10/12
50304/60000 [========================>.....] - ETA: 1s - loss: 0.0296 - acc: 0.990960000/60000 [==============================] - 11s 186us/step - loss: 0.0294 - acc: 0.9909 - val_loss: 0.0284 - val_acc: 0.9909
Epoch 11/12
60000/60000 [==============================] - 11s 186us/step - loss: 0.0296 - acc: 0.9909 - val_loss: 0.0280 - val_acc: 0.9914
Epoch 12/12
60000/60000 [==============================] - 11s 187us/step - loss: 0.0261 - acc: 0.9918 - val_loss: 0.0253 - val_acc: 0.9920
Test loss: 0.025258524810372548
Test accuracy: 0.992

PyTorch

環境準備

必要なライブラリをpip installする。

!pip install -q http://download.pytorch.org/whl/cu80/torch-0.3.0.post4-cp36-cp36m-linux_x86_64.whl
!pip install torchvision

20180121現在、ColabのPythonは3.6系

!python --version
Python 3.6.3

GPUがenabledか確認

下記を実行する。

import torch
torch.cuda.is_available()

True が返ればGPUがPyTorchから使えている。

  • 画面上部のメニュー ランタイム > ランタイムのタイプを変更 で、 ノートブックの設定 開き、ハードウェアアクセラレータに None を選択し、 保存
  • 上記を実行

すると、 False が返却される

サンプルコードの実行(CIFAR10 CNN Classifier)

Training a classifier — PyTorch Tutorials 0.3.0.post4 documentation のコードを、 【詳細(?)】pytorch入門 〜CIFAR10をCNNする〜 - Qiita を参考に逐次実行してみる。

正しく学習できることが確認できた。

[1,  2000] loss: 2.220
[1,  4000] loss: 1.863
[1,  6000] loss: 1.697
[1,  8000] loss: 1.588
[1, 10000] loss: 1.509
[1, 12000] loss: 1.466
[2,  2000] loss: 1.375
[2,  4000] loss: 1.357
[2,  6000] loss: 1.339
[2,  8000] loss: 1.306
[2, 10000] loss: 1.306
[2, 12000] loss: 1.288
Finished Training

Chainer

環境準備

chainer/google-colaboratory: Chainer on Google Colaboratoryに記述の、下記コマンドでインストールできるよう、Chainer公式で対応しました。(20181016追記)

!curl https://colab.chainer.org/install | sh -

ハンズオン

Chainer communityではColabを使ったハンズオンを作成されているようです。私自身はChainerはまだ読んだことしかなかったのですが、触れてみようと思いました。

github: chainer-community/chainer-colab-notebook
google drive: chainer-colab-notebook

まとめ

  • Google Colabで新たに無料でGPU環境が使えるようになった
    • K80, 連続12hr利用可能
  • お金も構築時間もショートカットできる
    • クラウドで自分でGPUインスタンス借りて構築しなくていい
    • GPUパソコン組み立てなくてもいい
  • 下記代表的なフレームワークが動かせる
    • TensorFlow
    • Keras
    • PyTorch
    • Chainer
  • ちょっとしたhands onをやったりするのに最適

次のステップ

Colaboratory関係のリンク集です。次何やろうかな、のネタになりましたら幸いです。また、こんなんやったよ!ネタをぜひお寄せください。

参考

下記の記事を参考にさせていただきました。ありがとうございます!