LoginSignup
66
60

More than 5 years have passed since last update.

Mac OSXでeGPUプログラミング環境構築(Keras,Tensorflow)

Last updated at Posted at 2017-11-10

もともとGPUを積んでないmacでGPUを使った機械学習をしたいので,外付けGPUボックスとグラフィックボードを用意して環境構築まで行いました。

環境

  • Mac Mini(macOS Sierra 10.12.6)
  • Python 3.6.3 (pyenvを使っています)
  • AKiTiO Node Thunderbolt3 eGFX Box
  • NVIDIA GeForce GTX1080

Mac MiniはThunderbolt3に対応していないので,Thunderbolt3 to Thunderbolt2アダプタが必要

GPUのセットアップ

こちらの記事を参考にGPUのセットアップをしました.
Macbook ProでThunderbolt 2接続の外付けGPUを使う(Netstor NA211TB + GeForce GTX 760)

NVIDIA Web Driverは378.05.05.25f01をインストールしています.

DNirzF5U8AUfGrG.jpg

CUDA,cuDNNのインストール

CUDA8.0をインストールして,アップデートすることでTensorflowがちゃんとGPUを認識しました.
参考記事:TensorflowでOSXのGPUが対応されたよ

CUDA

スクリーンショット 2017-11-09 18.52.52.png

CUDA Toolkit 8.0 GA2 (Feb 2017)をインストール
https://developer.nvidia.com/cuda-toolkit-archive

インストール後アップデート

システムの環境設定 -> CUDA -> Install CUDA Update

pathの追加

~/.bash_profile
#CUDA
export CUDA_HOME=/usr/local/cuda
export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:/usr/local/cuda/lib"
export DYLD_LIBRARY_PATH="$DYLD_LIBRARY_PATH:$CUDA_HOME/lib"
export PATH="$CUDA_HOME/bin:$PATH"

cuDNN

ダウンロードするには登録が必要
Download cuDNN v5.1 (Jan 20, 2017), for CUDA 8.0
https://developer.nvidia.com/rdp/cudnn-download

ダウンロードしたものを解凍して,中身をcudaの対応するフォルダに移動させます.
Finderでぶち込んでも構いません.

$ cd ダウンロードしたフォルダ
$ tar xzvf cudnn-8.0-osx-x64-v5.1.tgz
$ sudo mv -v cuda/lib/libcudnn* /usr/local/cuda/lib
$ sudo mv -v cuda/include/cudnn.h /usr/local/cuda/include

GPU用のTensorflowインストール

pipでgpu用のtensorflow(v1.1.0)をインストールします.

$ easy_install --upgrade pip
$ easy_install --upgrade six 
$ pip install tensorflow-gpu

Tensorflow 動作確認

$ python
Python 3.6.3 (default, Nov  1 2017, 20:28:06) 
[GCC 4.2.1 Compatible Apple LLVM 9.0.0 (clang-900.0.38)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import tensorflow as tf
>>> hello = tf.constant("Hello, TensorFlow")
>>> sess = tf.Session()

.
.
. 
name: GeForce GTX 1080
major: 6 minor: 1 memoryClockRate (GHz) 1.8095
pciBusID 0000:c3:00.0
Total memory: 8.00GiB
Free memory: 7.19GiB
.
.
.
>>> print(sess.run(hello))
'Hello, TensorFlow'
>>> a = tf.constant(10)
>>> b = tf.constant(16)
>>> print(sess.run(a + b))
26
>>> b = tf.constant(32)
>>> print(sess.run(a + b))
42

tf.Session()でGPUが認識できてない場合,cuDNNのバージョンが正しくなかったり,正しくインストール出来ていないかもしれないです.

実行速度の測定

mnistでcpu,gpuの実行速度が変わったか試してみる.
参考:Keras(TensorFlowバックエンド)でMNIST(DCNN)

Kerasが入ってない場合は

pip install keras

timeコマンドをつけてcpu,gpu実行時間を比べてみる。
コードは参考したリンクより引用

mnist.py
from __future__ import absolute_import
from __future__ import division
from __future__ import print_function

from keras.datasets import mnist
from keras.utils import np_utils
from keras.models import Sequential
from keras.layers.convolutional import Convolution2D, MaxPooling2D
from keras.layers.core import Activation, Flatten, Dense
from keras.callbacks import EarlyStopping

(X_train, y_train), (X_test, y_test) = mnist.load_data()
nb_classes = 10

X_train = X_train.reshape(-1, 1, 28, 28).astype('float32')
X_test = X_test.reshape(-1, 1, 28, 28).astype('float32')
X_train /= 255
X_test /= 255
y_train = np_utils.to_categorical(y_train, nb_classes)
y_test = np_utils.to_categorical(y_test, nb_classes)

model = Sequential()

model.add(Convolution2D(nb_filter = 16, nb_row = 3, nb_col = 3, border_mode = 'same', input_shape = (1, 28, 28)))
model.add(Activation('relu'))

model.add(Convolution2D(nb_filter = 32, nb_row = 3, nb_col = 3, border_mode = 'same'))
model.add(Activation('relu'))

model.add(MaxPooling2D(pool_size = (2, 2), border_mode = 'same'))

model.add(Convolution2D(nb_filter = 64, nb_row = 3, nb_col = 3, border_mode = 'same'))
model.add(Activation('relu'))

model.add(Convolution2D(nb_filter = 128, nb_row = 3, nb_col = 3, border_mode = 'same'))
model.add(Activation('relu'))

model.add(MaxPooling2D(pool_size = (2, 2), border_mode = 'same'))

model.add(Flatten())

model.add(Dense(1024))
model.add(Activation('relu'))
model.add(Dense(1024))
model.add(Activation('relu'))
model.add(Dense(nb_classes))
model.add(Activation('softmax'))

early_stopping = EarlyStopping(monitor = 'val_loss', patience = 2)

model.compile(loss = 'categorical_crossentropy', optimizer = 'adam', metrics = ['accuracy'])
model.fit(X_train, y_train, nb_epoch = 5, batch_size = 100, callbacks = [early_stopping])
score = model.evaluate(X_test, y_test)
print('Test loss:', score[0])
print('Test accuracy:', score[1])
time python mnist.py

結果

  • cpu 4m18.574s
  • gpu 0m26.091s

10倍近く速くなっていることが確認できました。
やったぜ。

66
60
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
66
60