Help us understand the problem. What is going on with this article?

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

2019/5/11 PR: こちらの内容を含め、2019年5月11日発刊の :books: 図解速習DEEP LEARNINGという本ができました。[2019年5月版] 機械学習・深層学習を学び、トレンドを追うためのリンク150選 - Qiitaでも、一部内容をご覧いただけます :smile:

19/1/11 18年1月の公開後、TensorFlow本体にKeras統合、Chainerがデフォルトで提供となるなど、状況が変化したため、大幅に加筆しました。TensorFlow 2.0 Previewについても追記しました。

19/1/31 PyTorchが標準インストールとなったこと、PyTorch/ TensorFlowのColab版チュートリアルを追記。

2019/3/9 Colaboratoryに関する情報交換Slackを試験的に立ち上げました。リンクより、登録・ご参加ください。

TL;DR

  • Google Colabで新たに無料でGPU環境が使えるようになった
    • K80, 連続12hr利用可能
  • お金も構築時間もショートカット
    • クラウドで自分でGPUインスタンス借りて構築しなくていい
    • GPUパソコン組み立てなくてもいい
  • こんな感じで、ノー準備で下記代表的なフレームワークが動かせる
    • image.png
  • ちょっとした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"]

!nvcc -v (GPUありでCUDAバージョンの確認)

nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2018 NVIDIA Corporation
Built on Tue_Jun_12_23:07:04_CDT_2018
Cuda compilation tools, release 9.2, V9.2.148

!nvidia-smi (GPUありでアサインGPU、Driverの確認)

Thu Jan 31 xx:xx:xx 2019       
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 396.44                 Driver Version: 396.44                    |
|-------------------------------+----------------------+----------------------+
| 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 K80           Off  | 00000000:00:04.0 Off |                    0 |
| N/A   30C    P8    26W / 149W |     11MiB / 11441MiB |      0%      Default |
+-------------------------------+----------------------+----------------------+

+-----------------------------------------------------------------------------+
| Processes:                                                       GPU Memory |
|  GPU       PID   Type   Process name                             Usage      |
|=============================================================================|
|  No running processes found                                                 |
+-----------------------------------------------------------------------------+

試し方

Google Colabを開く

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

新規ノートブックを作成

ファイル > Python3の新しいノートブック を選ぶ。

GPUをアサイン

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

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

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

TensorFlow

環境準備

TensorFlow 1.x系は、準備不要ですぐ使える。
2.0系はPreviewが始まっています。興味がある方は、TensorFlow 2.0 Previewを最速で試す on Colaboratory - Qiitaから試してみてください。

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

チュートリアル

TensorFlow Tutorialsは、各項目の Run in Google Colab ボタンを押すと、すぐに実行して試すことができます。

image.png

色々な事例を試す

【即スマホで試せる】55の深層学習実装 on Google Seedbank - 画像分類から翻訳、音楽生成まで - Qiitaから、様々な事例を試してみましょう。

Keras

環境準備

Kerasは、公式にTensorFlowに含まれるモジュールとなったため、別途インストールする必要はなくなりました。

from tensorflow import keras

Fashion MNIST分類を試す

Seedbank: "Fashion MNIST with tf.keras"こちらから、Kerasを用いた画像分類を試すことができます。

PyTorch

環境準備

19年1月から、PyTorchが、準備不要ですぐに使えるようになりました。

必要なライブラリをpip installする。
ただし、OS/Python/CUDAバージョン毎にインストール方法が異なることがある。Python/CUDAバージョンをチェックのうえ、PyTorchから、

  • Pytorch build: (選びたいver.)
  • Stable OS: Linux
  • Package: Pip

を選んだ上で、該当のPython/CUDAバージョンに合ったインストールコマンドを確認する。

バージョン、GPUがenabledか確認

下記を実行する。

import torch
torch.cuda.is_available()

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

print(torch.__version__)

1.0.0 など、プリインストールバージョンが表示される。

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

Training a classifier — PyTorch Tutorials 1.1.0 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

チュートリアル

PyTorchは、公式ページのチュートリアルが充実しています。
また、その内容をColaboratoryへポーティングしているリポジトリ(param087/Pytorch-tutorial-on-Google-colab: PyTorch Tutorial on google colaboratory.)があり、便利です。

Chainer

環境準備

18年12月より、Chainer, バックエンドのCuPy, iDeepが準備不要ですぐ使えるようになりました。

import chainer
chainer.print_runtime_info()

下記が返されます。

Platform: Linux-4.14.79+-x86_64-with-Ubuntu-18.04-bionic
Chainer: 5.0.0
NumPy: 1.14.6
CuPy:
  CuPy Version          : 5.0.0
  CUDA Root             : /usr/local/cuda
  CUDA Build Version    : 9020
  CUDA Driver Version   : 9020
  CUDA Runtime Version  : 9020
  cuDNN Build Version   : 7201
  cuDNN Version         : 7201
  NCCL Build Version    : 2213
iDeep: 2.0.0.post3

チュートリアル

Chainer communityではColabを使ったハンズオンを作成されています。

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

また、2018年12月には、このような素晴らしい資料が公開されました。

他のプリインストールパッケージ

下記コマンドで確認できます。

!pip list

まとめ

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

次のステップ

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

参考

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

tomo_makes
書いたもの: 『図解速習DEEP LEARNING』『機械学習の炊いたん。』ほか すきなもの: 機械学習、グラフ、いろんな可視化、つくる、アジア・中東各国料理と音楽
https://amzn.to/2J0QNGF
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした