Take’s diary

Macとマイコンに関すること--ワクワクの製作日記

JETSON TX1 だけじゃなく Mac OSX10.11.5 にも高速 Caffe をインストールする。

当然cuDNNをONにして

前回までTX1にGPUを使い、最大限スピードアップさせたCaffeをインストールしました。ただしTX1に積んでいるGPUは最新のものより見劣りします。本来TX1は、時間のかかる学習は、最新のGPUを持つPCで行い、学習済みデータをTX1で使うというコンセプトみたいです。

CaffeはCPUのみの実行では、スピードがかなり遅くなります。これから勉強して行く上で、Mac上にcuDNNを有効にした高速Caffeをインストールすることが、何かと重要になりますが、かなり手こずりそうな気配。

じゃーということで、今回は私のMacに積んでいるほとんど死んだ状態のGPUを思い切り働かせてやることにしました。

ただし現行のCaffeはGPUメモリ4Gbyteを想定しているそうなので、今回のGPUでは力不足です。Caffeのexamplesフォルダにあるipython演習00-classification.ipynb、01-learning-lenet.ipynb及びcifar10、mnistまでは動きました。

f:id:TAKEsan:20160711134250j:plain

まず現在のMac仕様

 iMac  Late2012  (Corei7 3.4GHz、 メモリ 16Gb、GPU :NVIDIA GeForce GTX 675MX VRAM 1024 MB)

と多少古い仕様ですが、GPUのコア数が1,000個くらいなので、うまくいけば単純にTX1の4倍くらいにはなりそう。

Caffeインストールについて

Macへのインストールについて、現状の問題点と自分的な目標は、

  • 紹介している記事は現在のところOSX10.11.1まで。
  • それもほとんどCPU動作モード-->スピード的に許せない!!
  • cuDNNを有効にさせたビルドは、トラブル続出で皆さん諦めている。
  • 最新版Macは、GPUNVIDIA製品ではないため、cuDNN環境構築不可能-->インストール記事の絶対数が少ない。
  • 現状の本家CaffeはMakefileを見ると、OSX10.10、10.9のみサポート。10.11だと10.9に誤認識されてしまう--->blas関連のエラーが続出!!
  • 私自身MacUnixがわからない(linuxが多少理解できる程度)。
  • Unixがわからないので変なことはしない。
  • いつものようにコアとなるWEB記事を見つける。

実際の作業

1.Macのapt-getに相当するbrewをインストール

 これは検索すれば沢山出てくるのでカット。インストール済みならば次へ。

2.anacinda2.1.0をインストール

 ディープラーニングやろうぜ! MacBookPro-MacOSX10.10にGPUを使えるCaffeをビルドする

を参考にしました。anacondaインストール以外caffeインストールについてOSX10.11では参考になりません。記事中のcmakeを使う方法では、どうしてもcuDNNを認識してくれないからです(記事中のcmake出力でもcuDNNがOFFになってる)。多分このままbuildに成功しても中途半端にGPUを使うことになるので、かなり遅くなります。実際これと似た状態でbuild成功したのですが、MNISTテストで、TX1より遅くなりました(GPUを使っても性能が格段に良いMacがTX1に負けてしまう!?。後述スピード比較参照)。私の目標ではこの状態が満足できません。ただし、試行錯誤の段階で私的には大変勉強になりました。

anacondaのインストール確認は、コマンドからpython を実行させて

Python 2.7.11 |Anaconda 4.1.0 (x86_64)| (default, Jun 15 2016, 16:09:16) 

[GCC 4.2.1 (Based on Apple Inc. build 5658) (LLVM build 2336.11.00)] on darwin

Type "help", "copyright", "credits" or "license" for more information.

Anaconda is brought to you by Continuum Analytics.

Please check out: http://continuum.io/thanks and https://anaconda.org

>>> 

こんな表示が出たらOK。anacondaは以前EdisonのSimpleCVインストールの時も使っていたので、ありがたさがよーく理解できます。

3.brew update ができないため、以下のコマンドをインストール

   ls -ld /usr/local

これがかなり重要 OSX EI Capitanからsudoでもbrew updateができなくなったためとか。

4.CUDA Driver Version: 7.5.30 をインストール。

ここからインストール

CUDA 7.5 Downloads | NVIDIA Developer

終了するとシステム環境設定の中に追加されている。下にも書いてあるが /Developre/NVIDIA/CUDA-7.5 ができているかどうかターミナルで一応確認。これが一番簡単です。インストール後、システム環境設定からCUDAを選択すると将来アップグレード可能です。気に入らない方は以下のような記事もあるので参考にして見てください。

Mac (El Capitan) + Homebrew で CUDA 7.5 をインストールする手順 - Qiita

ちょっと違った方法でabacondaのインストール方法も紹介しています。

5.Caffeインストール本番

いろいろな方法で何回もbuildを繰り返したのですが、ことごとく失敗。

結局

Deep learning with Cuda 7, CuDNN 2 and Caffe for Digits 2 and Python on iMac with NVIDIA GeForce GT 755M/640M GPU (Mac OS X)

が分かりやすくて一番参考になりました。ただし対象が「OS X 10.10.4」です。以下この記事上の注意事項をメモします。

まず自分のMacに以下の2つのフォルダがあることを確認

     /usr/local/cuda

         /Developre/NVIDIA/CUDA-7.5

これはCUDA Driver Version: 7.5.30をインストールするとできています。出来ていなかったらCUDAのインストールが失敗しています。

    1. Install Mac Os Command Line Tools if not already installed :

    2. Install Cuda 7 (pass this step if your Mac GPU is not CUDA capable)

は、そのまま実行。

          3.Download CuDNN (pass this step if your Mac GPU is not CUDA capable)

では記事通りではなく、NVIDIA cuDNN | NVIDIA Developerからcudnn-7.5-osx-x64-v5.1-rc.tarをダウンロードする必要があります。記事のままではCUDAのバージョンと合わないので、エラー続出!!(冷静に考えれば当たり前のことですけど、作業中は歳のせいか訳がわかんなくなる)

 解凍したフォルダに入ると、この例題とは違いlibとincludeフォルダが存在しているので各々の中身をコピーすること。

ダウンロードには、NVIDIAへの登録が必要です(とても簡単)。

cudnn.hのコピー先は /Developre/NVIDIA/CUDA-7.5に変更すること。

 

    4. Install Python packages

    5. Install other packages

はこのまま。

    6. Install boost 1.57 は要注意。基本このままでいいのですが

   brew uninstall boost boost-python

を実行してから。文中の内容は、Boost1.58 をダウングレードさせる方法です。

 boost.rbと boost-python.rbをダウンロードして所定のディレクトリへコピーしてからBoost1.57を再インストールしています。一部Web上の記事に1.55にしろとか説明がありますがCaffe build時確実ににエラーとなります。

    7. Clone the caffe repositoryはこのまま。

    8. Create the configuration file で、

Makefile.configの内容を次のようにしてください。USE_CUDNN:=1のコメントを外すのが今回のミソpython、anaconda周りも直しています。 

 いろいろな記事にg++を直すとか、blasを変更しろとか、CUDA_DIRを変更しろとか書いてありますが、今回は全く無視。挙げ句の果てMakefileも直すなんて記事もありましたが、すべてbuild失敗でした。(たまたま成功してもruntestが上手くいかない)

 推測ですが、cuDNNの設定を有効にすることでBLASの設定が無視され、第3の存在(cuBLAS?)に移行。そのためErrorが出なくなるような気がします。

## Refer to http://caffe.berkeleyvision.org/installation.html

# Contributions simplifying and improving our build system are welcome!

 

# cuDNN acceleration switch (uncomment to build with cuDNN).

  USE_CUDNN := 1

 

# CPU-only switch (uncomment to build without GPU support).

# CPU_ONLY := 1

 

# uncomment to disable IO dependencies and corresponding data layers

# USE_OPENCV := 0

# USE_LEVELDB := 0

# USE_LMDB := 0

 

# uncomment to allow MDB_NOLOCK when reading LMDB files (only if necessary)

# You should not set this flag if you will be reading LMDBs with any

# possibility of simultaneous read and write

# ALLOW_LMDB_NOLOCK := 1

 

# To customize your choice of compiler, uncomment and set the following.

# N.B. the default for Linux is g++ and the default for OSX is clang++

# CUSTOM_CXX := g++

 

# CUDA directory contains bin/ and lib/ directories that we need.

CUDA_DIR := /usr/local/cuda

# On Ubuntu 14.04, if cuda tools are installed via

# "sudo apt-get install nvidia-cuda-toolkit" then use this instead:

# CUDA_DIR := /usr

 

# CUDA architecture setting: going with all of them.

# For CUDA < 6.0, comment the *_50 lines for compatibility.

CUDA_ARCH := -gencode arch=compute_20,code=sm_20 \

-gencode arch=compute_20,code=sm_21 \

-gencode arch=compute_30,code=sm_30 \

-gencode arch=compute_35,code=sm_35 \

-gencode arch=compute_50,code=sm_50 \

-gencode arch=compute_50,code=compute_50

 

# BLAS choice:

# atlas for ATLAS (default)

# mkl for MKL

# open for OpenBlas

BLAS := atlas

# Custom (MKL/ATLAS/OpenBLAS) include and lib directories.

# Leave commented to accept the defaults for your choice of BLAS

# (which should work)!

# BLAS_INCLUDE := /path/to/your/blas

# BLAS_LIB := /path/to/your/blas

 

# Homebrew puts openblas in a directory that is not on the standard search path

# BLAS_INCLUDE := $(shell brew --prefix openblas)/include

# BLAS_LIB := $(shell brew --prefix openblas)/lib

 

# This is required only if you will compile the matlab interface.

# MATLAB directory should contain the mex binary in /bin.

# MATLAB_DIR := /usr/local

# MATLAB_DIR := /Applications/MATLAB_R2012b.app

 

# NOTE: this is required only if you will compile the python interface.

# We need to be able to find Python.h and numpy/arrayobject.h.

#PYTHON_INCLUDE := /usr/include/python2.7 \

# /usr/lib/python2.7/dist-packages/numpy/core/include

# Anaconda Python distribution is quite popular. Include path:

# Verify anaconda location, sometimes it's in root.

 ANACONDA_HOME := $(HOME)/anaconda

 PYTHON_INCLUDE := $(ANACONDA_HOME)/include \

$(ANACONDA_HOME)/include/python2.7 \

$(ANACONDA_HOME)/lib/python2.7/site-packages/numpy/core/include \

 

# We need to be able to find libpythonX.X.so or .dylib.

# PYTHON_LIB := /usr/lib

 PYTHON_LIB := $(ANACONDA_HOME)/lib

 

# Homebrew installs numpy in a non standard path (keg only)

# PYTHON_INCLUDE += $(dir $(shell python -c 'import numpy.core; print(numpy.core.__file__)'))/include

# PYTHON_LIB += $(shell brew --prefix numpy)/lib

 

# Uncomment to support layers written in Python (will link against Python libs)

 WITH_PYTHON_LAYER := 1

 

# Whatever else you find you need goes here.

INCLUDE_DIRS := $(PYTHON_INCLUDE) /usr/local/include

LIBRARY_DIRS := $(PYTHON_LIB) /usr/local/lib /usr/lib

 

# If Homebrew is installed at a non standard location (for example your home directory) and you use it for general dependencies

# INCLUDE_DIRS += $(shell brew --prefix)/include

# LIBRARY_DIRS += $(shell brew --prefix)/lib

 

# Uncomment to use `pkg-config` to specify OpenCV library paths.

# (Usually not necessary -- OpenCV libraries are normally installed in one of the above $LIBRARY_DIRS.)

# USE_PKG_CONFIG := 1

 

BUILD_DIR := build

DISTRIBUTE_DIR := distribute

 

# Uncomment for debugging. Does not work on OSX due to https://github.com/BVLC/caffe/issues/171

# DEBUG := 1

 

# The ID of the GPU that 'make runtest' will use to run unit tests.

TEST_GPUID := 0

 

# enable pretty build (comment to see full commands)

Q ?= @

 

# shared object suffix name to differentiate branches

LIBRARY_NAME_SUFFIX := -nv

修正したら 9. Build の通りpycaffeまで make!!

途中かなりの数のワーニングが表示されましたが、runtestが正常に終了するので、問題ないと思います。TX1よりMacの方が流石にCPUスピードが早いので runtestも10分程度で終了しました。(pycaffeのインストールも問題無し)

 runtest中メモリーオーバーエラー(Check failed: status == CUDNN_STATUS_SUCCESS (2 vs. 0) かCheck failed: status == CUDNN_STATUS_SUCCESS (4 vs. 0) )になった場合、Macのディスプレイ解像度を最低にすれば、正常に終了すると思います。何せGTX 675MXは、GPUモリーが1Gなので、ダマシダマシ使う必要あり。(Caffeのexampleも同様なエラーが出た場合は、この方法が結構有効)

スピード比較

MNISTの学習テストでTX1(GPUクロックをメーカー推奨まで上げたもの)と比較すると、10,000件の学習で TX13分21秒に対して、今回インストールしたMacではピッタリ1分3倍以上高速でした。やっぱりGPUのコア数に比例するんですね。最新版のGPUではどうなってしまうんでしょう。物欲がヒシヒシと.......。アッ危ない。今後Macを手に入れる時は最強のGPUを積んだものにしなくてはっ!!。

 と思っても、現状は全てのMacAMDIntelGPUに変わっているので、cuDNNの恩恵を実感できる環境ではありません。少し古いMacをお持ちの皆さん!。へっへっへーですね!!

 ちなみにcuDNNを使わないCaffe(CUDAのみ)もMac上に作ったので、計測したら5分15秒でした。つまりCaffeを使う限り、現在のMacではこのレベル以上早くなりません。現段階のcuDNNの実力と同時に、TX1の底力を感じます。AppleNVIDIAの間に訴訟問題があった様ですが、一消費者として、Appleがこの技術を切り捨ててしまったことについて、腹立たしさを覚えます。

 次に貼り付けた動画が、CUDA+cuDNNをONにしたTX1とMacのMNIST同時テスト画像です。一見普通に見えますが、 すごいことです。この動画表示時間では、CPUモードだと両者共ほとんど画像が動かないと思います。

                             

左がTX1,右が今回MacにインストールしたCaffeでMNISTの学習テストを同時に実行しているところ。どちらもcuDNN ON。 明らかにスピードが違います。Mac早っ!!。CPUのみのビルドを実施したMacでは多分TX1の5倍以上遅くなると思われます(前々回の予想で計算すると、MacのCPUのみでMNISTを動かした場合、何と24分必要。もしそうだとすれば、CUDA+cuDNNで24倍速くなるということになります(んなワケないか....)。しかし一部記事にintel core i3で59分というデータがありました。ということは当たっている可能性ありカモ。もう体力の限界。興味のある方は、ぜひTRY。)

 caffeの解説でこんな素晴らしい記事があってCaffeを使ったCNNによる手書き文字分類 [4] - ネットワークの訓練方法 - blog.li.nuここではGeForce TITAN Xを使って5,000件の学習で1分だそうです。今回のテストは10,000件が1分で正解率99%。TITANに比べればかなり非力なGPUなのにどうしてこんなに早いのか不思議です。わずか4ヶ月でCUDA+cuDNNの効率が格段に上がったのでしょうか?

その後(7/16)CPUモードでコンパイルしたMNIST sampleを動かしてみたら、

 Caffe付属のMnist exampleから10,000の学習をCPUモードで動かしてみたところ、6分20秒でした。結局こんな感じです。

       CPUモード  CUDAのみ  CUDA+cuDNN

        6分21秒    5分15秒     1分  

思った以上にCPUモードが早い様です。exampleを含めたCaffe全体が最適化されてるんでしょう。それでもCUDA+cuDNNが、圧倒的に早いのは確かです。

最後に

Macが5日間くらい回りっぱなしだったので、ハードディスクがいかれてしまわないかどうか心配。おかげさまで、makeとcmakeの違いやbrewの操作方法が少し理解できるようになりました。

cudaのサンプルをMacとTX1で同時に実行させた動画です。

やはりMNISTテストと同じ様に3倍くらいの差がありますね。ただしポケットサイズでは最強!!

       

 

                            では、 また。