Take’s diary

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

Jetson TX1 でUSB3.0につないだSSDからUbuntuをBootしてみる。

 JETSON TX1の電源が壊れてから1.5ヶ月。

 交換品が戻ってきました。

f:id:TAKEsan:20161015142959j:plain

                  Jetson TX1本体はこんな感じ

f:id:TAKEsan:20161015143000j:plain

             分厚いアルミの放熱版でサンドイッチされてます。

 ちょうどJetpackが2.3にアップデートされていたので、最新版をインストールしてみました。最初の感想は、画面のもたつきや、起動時のHDMIディスプレイの認識不良がなくなり、市販ノートパソコン並みにとてもスムース。Bluetoothに接続した入力機器を起動時からストレスなく認識するようになりました。なぜかバージョンアップで、CPUスピードもintel Joule並みに早くなってます。下の方にZEDステレオカメラで画像測定を実行している動画を載せましたので、確認してみてください。

 待った甲斐がありました。やっぱハード発売からソフト安定まで1年以上かかるんですね。また、USBにつないだWebCAMERAをやっとVideo0で認識できるようになりました。ということは、OpenCVのカメラ系Exampleが修正なしで動くようになります。

 逆に弱点は、標準OpenCVやCaffeのインストールに特殊な前処理が必要になったことです。Torchに関して、現状インストールできないといった方が良さそうな感じです(時間の問題でしょうけど)。この辺りは後述します。

ここまで良くなると次はU-BOOTでOS選択。

※OSが3.1以降ではここに記述した方法ではSDカード、USB3.0共うまく起動できないようです。現在検証中なのでしばらくお待ち下さい。2018.3.20

 すなわち、本体内蔵のeMMCを使わずに、SDカードでUbuntuをブートさせることです。これが簡単にできると、応用の幅がグンと広がります。これが思いの外簡単に実現できました。いつものようにその後が地獄でしたけど。

f:id:TAKEsan:20161017200727j:plain

今回取り上げたSSD、Bluetooth入力機器、ZEDカメラを最小のマザーボードにTX1を取り付けてつないで、UbuntuはSSDから実行させてます。今回の操作は、すべてマザーボードにObrbitty Carrir for Jetson TX1を使ってます。

f:id:TAKEsan:20161017200728j:plain

              TX1の大きさはPiとほぼ同じ

SDカードでUBUNTUブートを実現させるには

ヒントは

https://devtalk.nvidia.com/default/topic/923800/boot-from-sd-card/

の中ほどに書いてありました。次のようにします。

まずNvideaのホームページから

Embedded Download Center | NVIDIA Developer

最新版のSample filesystemとDriver PackagesをTX1にダウンロードします。ダウンロードしたファイルは今回バージョンの場合以下の2種類です。

          Tegra210_Linux_R24.2.0_aarch64.tbz2

          Tegra_Linux_Sample-Root-Filesystem_R24.2.0_aarch64.tbz2

 バージョンアップしたTX1にはWebブラウザが全く付いていません。(実はコマンドラインからchromium-browser と打ち込むとchromiumブラウザが立ち上がるんですが)

  sudo apt install midori

で軽量なMidoriブラウザをインストールしました。ダウンロード用だけなら、TX1ではスピード的に全く問題ありません。

 ダウンロードにはNvideaへのログインが必要ありません。(現状の最新版は24.2です)当然最初は、本体のeMMCブートとなりますが、通常のバージョンアップをすると最終でも60%近くのeMMCディスク領域を使ってしまうので、ここからの操作は、ext4にフォーマットしたUSB接続SDカードなどで行うのが最良。本体のSDカードスロットは、OSインストール用に使います。

 まず、gpartedなどで、本体にセットしたSDカード(16G以上)をext4でフォーマットします。フォーマット領域は全領域で構いません。この時フォーマットした領域がemmcblk1p1であることを確認してから、TX1に上記2つのファイルをダウンロードしたディレクトリで次のコマンド群を実行。手っ取り早いのはdfコマンドで、ディスク接続内容を確認すればOK

f:id:TAKEsan:20161015103318p:plain

上の例では.dev/mmcblk0p1が内部eMMCの第1パーテーション、/dev/mmcblk1p1がSDカードスロットにセットしたSDカードの第1パーテーション。ちなみにsda2はUSBに接続したSSDの第2パーテーションです。

 今回の外部メモリへのOSインストール方法の良いところは、TX1上で全ての操作ができてしまうことです。操作は以下のようにコマンド入力します。朱書きで書いたディスク名称はくれぐれも間違えないように!!。この部分でOSの書き込み先を変更できます。

sudo tar xvpf Tegra210_Linux_R23.2.0_armhf.tbz2
sudo mount /dev/mmcblk1p1 Linux_for_Tegra/rootfs
cd Linux_for_Tegra/rootfs
 sudo tar xvpf ../../Tegra_Linux_Sample-Root-Filesystem_R24.2.0_aarch64.tbz2

 cd ..
 sudo ./apply_binaries.sh

これだけです。コマンド間でちょっと時間が必要ですが、あとはブートディスク選択部分を書き換えるだけ。書き換えるファイルは、本体のeMMC入っている extlinux.confです。

cd /boot/extlinux

sudo nano extlinux.conf

次の様に直します、

TIMEOUT 30
DEFAULT sdcard

MENU TITLE p2371-2180 eMMC boot options

LABEL primary
MENU LABEL primary kernel
LINUX /boot/Image
INITRD /boot/initrd
FDT /boot/tegra210-jetson-tx1-p2597-2180-a01-devkit.dtb
APPEND fbcon=map:0 console=tty0 console=ttyS0,115200n8 androidboot.modem=none androidboot.serialno=P2180A00P00940c003fd androidboot.security=non-secure tegraid=21.1.2.0.0 ddr_die=2048M@2048M ddr_die=2048M@4096M section=256M memtype=0 vpr_resize usb_port_owner_info=0 lane_owner_info=0 emc_max_dvfs=0 touch_id=0@63 video=tegrafb no_console_suspend=1 debug_uartport=lsport,0 earlyprintk=uart8250-32bit,0x70006000 maxcpus=4 usbcore.old_scheme_first=1 lp0_vec=${lp0_vec} nvdumper_reserved=${nvdumper_reserved} core_edp_mv=1125 core_edp_ma=4000 gpt android.kerneltype=normal androidboot.touch_vendor_id=0 androidboot.touch_panel_id=63 androidboot.touch_feature=0 androidboot.bootreason=pmc:software_reset,pmic:0x0 net.ifnames=0 root=/dev/mmcblk0p1 rw rootwait

LABEL sdcard
MENU LABEL sdcard kernel
LINUX /boot/Image
INITRD /boot/initrd
FDT /boot/tegra210-jetson-tx1-p2597-2180-a01-devkit.dtb
APPEND fbcon=map:0 console=tty0 console=ttyS0,115200n8 androidboot.modem=none androidboot.serialno=P2180A00P00940c003fd androidboot.security=non-secure tegraid=21.1.2.0.0 ddr_die=2048M@2048M ddr_die=2048M@4096M section=256M memtype=0 vpr_resize usb_port_owner_info=0 lane_owner_info=0 emc_max_dvfs=0 touch_id=0@63 video=tegrafb no_console_suspend=1 debug_uartport=lsport,0 earlyprintk=uart8250-32bit,0x70006000 maxcpus=4 usbcore.old_scheme_first=1 lp0_vec=${lp0_vec} nvdumper_reserved=${nvdumper_reserved} core_edp_mv=1125 core_edp_ma=4000 gpt android.kerneltype=normal androidboot.touch_vendor_id=0 androidboot.touch_panel_id=63 androidboot.touch_feature=0 androidboot.bootreason=pmc:software_reset,pmic:0x0 net.ifnames=0 root=/dev/emmcblk1p1 rw rootwait

LABEL usbssd
MENU LABEL usbssd kernel
LINUX /boot/Image
INITRD /boot/initrd
FDT /boot/tegra210-jetson-tx1-p2597-2180-a01-devkit.dtb
APPEND fbcon=map:0 console=tty0 console=ttyS0,115200n8 androidboot.modem=none androidboot.serialno=P2180A00P00940c003fd androidboot.security=non-secure tegraid=21.1.2.0.0 ddr_die=2048M@2048M ddr_die=2048M@4096M section=256M memtype=0 vpr_resize usb_port_owner_info=0 lane_owner_info=0 emc_max_dvfs=0 touch_id=0@63 video=tegrafb no_console_suspend=1 debug_uartport=lsport,0 earlyprintk=uart8250-32bit,0x70006000 maxcpus=4 usbcore.old_scheme_first=1 lp0_vec=${lp0_vec} nvdumper_reserved=${nvdumper_reserved} core_edp_mv=1125 core_edp_ma=4000 gpt android.kerneltype=normal androidboot.touch_vendor_id=0 androidboot.touch_panel_id=63 androidboot.touch_feature=0 androidboot.bootreason=pmc:software_reset,pmic:0x0 net.ifnames=0 root=/dev/sda1 rw rootwait

 簡単に言えば元々記述してあるデータ extlinux.conf(黒部分)をコピーして、2回ペースト。各々青の部分を変更するだけです。ブート指定は緑の部分です。sda1とはUSB3.0に接続した外部記憶装置のこと、とりあえず追加しておくと後で便利。ここではsdcardでブートする設定です。内部eMMCブートの場合は緑の部分をsdcardからprimaryに変更するだけです。

 ブートは内部eMMC上の/boot/extlinux/extlinux.confで判断する様なので、SDカードからBOOTしてもファイルマネージャーで内部eMMCを変更できるのでどうにでもなります。

 くれぐれもextlinux.confの書き換えは注意してください。間違えるとTX1に直結したターミナルでないとBOOTできなくなります。完了したら、 

sudo reboot -f

ワクワクの時です。

一応SDカードからBOOTできたものの

 なんか反応が鈍すぎる。まるで一時代前のPiでXwindowを操作してるみたいな....。

考えてみたら当然ですよね。どんなに早いSDカードを入れても、USB2.0並みの読み書きスピードですから。そこで、USB3.0対応のSDカードリーダーにSDカードを差してUSB3.0へ接続。extlinux.confの「DEFAURT sdcard」をDEFAURT usbssd に変えてrebootしてみました。こうすると内部eMMC並みのスピードになります。ここでUSB接続のSSDに変えたらどうなるんでしょ。そこで

USB3.0に接続したSSDにUbuntuを書き込んだら

(SSDにUbuntuをインストールして、上記茶色のemmcblk1p1 を sda1に変更してリブート)

さらにサクサク快適!!。ノートパソコン並みになりました。でもここからが大変。

CUDA、cuDNN、OpenCV2.4.13、Caffeインストールがなかなか...。

 インストールしたUbuntuは、見た目がサクサクでも。サードパーティーのアプリケーションがインストールできない。という最悪の状況。

 ここからは失敗の挙句なんとか使える様にした結果です。Linuxに精通している方は笑っちゃって下さい。

まずCUDAインストール

 標準JetpackインストールでeMMCのhomeにインストールされたCuda-l4tをディレクトリごとBootしたhomeへコピー。

cd cuda-l4t 

./cuda-l4t.sh cuda-repo-l4t-8-0-local_8.0.34-1_arm64.deb 8.0 8-0

でcuda8.0がインストールできます。でもこれだけではcuDNNが使えません。

次にcuDNN5.1インストール。

 一般的なlinuxへのインストール方法では全くダメでした。TX1へのインストールは、Ubuntu母艦環境でTX1のインストール時にダウンロードされたcuDNN-v5.1.zipを母艦からTX1のhomeへコピーすることから始めます。コピー方法はSDカードを使うなりなんなり各自考えて下さい。

 とにかくコピーしたら解凍して、中にあるlibcudnn5-dev_5.1.5.-1+cuda8_arm64.debを使います。同じディレクトリから、

sudo dpkg -i libcudnn5-dev_5.1.5.-1+cuda8_arm64.deb

sudo apt update

を実行。

これを実行するとdevcudnn-xxxxxをインストールしろとかなんとかメッセージが出るのでこの通り sudo apt install XXXXXXXX でcuDNNをインストール。

(すいませんファイル名忘れました)

 Cuda8.0とcuDNN5.1が連携して、TX1最強のGPU環境が構築されます。home にjetson_clocks.shがインストールされてるんで sudo ./jetson_clocks.sh を実行すると最速GPUクロックに変更されてFanが回り出します。卓上でTX1を使うには、これを実行するのが良いと思います。

 ここまで来ると、なぜかapt-getで自由にパッケージがインストールできる様になります。ここで、nanoやmidoriブラウザをインストールして、システムを最新にします

sudo apt update

sudo apt upgrade

かなり時間がかかりますが終了したらreboot。

ここからOpenCVとCaffeインストール

例によって依存アプリをいっぱいインストール

sudo add-apt-repository universe
sudo apt-get update

sudo apt-get -y install build-essential make cmake cmake-curses-gui g++
sudo apt-get -y install libavformat-dev libavutil-dev libswscale-dev
sudo apt-get -y install libv4l-dev
sudo apt-get -y install libeigen3-dev
sudo apt-get -y install libglew1.6-dev
sudo apt-get -y install libgtk2.0-dev
sudo apt-get install cmake git aptitude screen libboost-all-dev \
libgflags-dev libgoogle-glog-dev protobuf-compiler libprotobuf-dev \
bc libblas-dev libatlas-dev libhdf5-dev libleveldb-dev liblmdb-dev \
libsnappy-dev libatlas-base-dev python-numpy libgflags-dev \
libgoogle-glog-dev python-skimage python-protobuf python-pandas

sudo apt-get -y -qq install libgtk2.0-dev ocl-icd-opencl-dev qt5-default

 次にOpenCV2.4.13をインストール。(最初は何かと便利な2.4で状況を確認してから、必要に応じて3.0を再インストールすれば良い)

本家からOpenCV2.4.13をダウンロード。解凍したopencvディレクトリに入って

mkdir buikd 

cd build

今回はOpenGLソースもコンパイルできる環境を作りたかったのですが、OpenCVのmake中、どうしてもGL部分で引っかかるので、これを参考

Jetson TK1 compile from source fails with cuda and opengl interop · Issue #5205 · opencv/opencv · GitHub

にcudaヘッダーファイルを変更。

sudo nano /usr/local/cuda/include/cuda_gl_interop.h

開いたら、前の方に書いてある

#ifndef GL_VERSION

#error Please include the appropriate gl headers before including cuda_gl_interop.h

#endif

#else

を削除。それからいつものようにcmakeしてmake。(11/8 赤部分の数値が文字化けしてました)

cmake .. \

-DWITH_OPENGL:BOOL=ON \

-DWITH_QT:BOOL=ON \

-DWITH_CUDA:BOOL=ON \

-DCUDA_ARCH_BIN=5.3 \

-DCUDA_ARCH_PTX=5.3 \

-DENABLE_FAST_MATH=1 -DCUDA_FAST_MATH=1 -DWITH_CUBLAS=1 -D CUDA_USE_STATIC_CUDA_RUNTIME=OFF\

-DCMAKE_INSTALL_PREFIX=/usr/local \

-DBUILD_TESTS:BOOL=OFF \

-DBUILD_PERF_TESTS:BOOL=OFF \

-DWITH_FFMPEG:BOOL=OFF \

-DENABLE_NEON:BOOL=ON \

-DBUILD_EXAMPLES:BOOL=ON \

-DINSTALL_C_EXAMPLES:BOOL=OFF \

-DINSTALL_PYTHON_EXAMPLES:BOOL=ON \ ..

make -j4

驚くほどワーニングが出ますが、一応OKみたいです。

 すでにpython cv2ライブラリがインストールできています。cuda8.0になってNVCCコンパイル時間が早くなってることが確認できました。

次にcaffe

 Opecvがインストールできたら、Caffeは簡単。問題が多かったのですが、最終的に前の記事通りでOK。Pycaffeはインストール中エラーが出ますが、そのままコンパイルできるので一応対策は考えないことにしました。

Makefile.configの書き換えが必要。次の通り

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

# Uncomment if you're using OpenCV 3

# OPENCV_VERSION := 3

# 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_30,code=sm_30 \

              -gencode arch=compute_35,code=sm_35 \

              -gencode arch=compute_50,code=sm_50 \

               -gencode arch=compute_53,code=sm_53 \

               -gencode arch=compute_53,code=compute_53

 

# 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 \

# Uncomment to use Python 3 (default is Python 2)

# PYTHON_LIBRARIES := boost_python3 python3.5m

# PYTHON_INCLUDE := /usr/include/python3.5m \

#                 /usr/lib/python3.5/dist-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 /usr/include/hdf5/serial 

LIBRARY_DIRS := $(PYTHON_LIB) /usr/local/lib /usr/lib /usr/lib/aarch64-linux-gnu/hdf5/serial

# 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

# N.B. both build and distribute dirs are cleared on `make clean`

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 ?= @

 朱書き部が修正したところです。ここまで来るには、cuDNNのインストールやMakefile.configの修正に手間取って無駄な時間を過ごしてしまいました。

今度は、ipython notebookが正常に動かない

 CaffeのExampleに入っているnotebookファイルが全く動きません。使ってみると分かるんですが、これ最高のライブラリなんです。原因はソフトが変更されたからみたいです jupyterに!!。本当にもう。

 sudo pip install jupyter でインストールできます。試しにcaffe/examples から jupyter notebook と打ち込むと、midoriからnotebookが立ち上がります。動作を確認するため00-classification.ipybを選択。初めての人は私のように驚いてしまうでしょう。 

f:id:TAKEsan:20161015115743p:plain

macにインストールしたCaffe examples からnotebookを立ち上げた例。Pythonで書かれた例題が画像を確認しながら実行できる。

全部終わったと思ったら

ubuntu software(前のUbuntuソフトセンター) 設定の中の「ソフトウエア&アップデート」と言語サポートが正常に動かない。これは、どっかのターミナルでsudo aptd実行したままにすれば。とりあえず動作。まーapt-get またはaptでパッケージが普通にインストールできるので良しとしました。

最後に

 caffeのexampleは全て完璧に動きます。しかも確実に前より早く。Mnistのスクリプトを実行してみると、

./data/mnist/get_mnist.sh

./examples/mnist/create_mnist.sh

./examples/mnist/train_lenet.sh

学習スタートから終了まで以前の最速環境で3分21秒に対して、2分36秒で終了。1分近く早くなってました。

 Torchはインストールできませんでした。ここ10日前後でインストールできた方がいるようですが、その通りスクリプトを実行してもビルドが止まってしまいます。解決は時間の問題だと思いますので、もう少し待ったほうが良いようです。

 Nividiaが説明していますが、DIGITSはTX1にインストールできません。TX1が早いと言っても i7 6700クラスでデープラーニングを実行した場合 i7より早いというだけです。(これだけでもすごいことですけど)本格的な学習を簡単に実行できるのがDIGITの売りですから、10倍以上早いGPU環境でないと全く実用的ではありません。最小の大きさで、学習済みデータを最速に実行できるのがTX1の特徴です。しかもGPIO制御もできる。もー夢がいっぱい広がります。DIGITSに執着しないで他のことを目一杯楽しみましょう。

 ZEDも試してみましたが、これもすごかったですよ。先のjetson_clock.shを実行させてからZEDのtoolsを試しに実行させてみるとこんな感じでした。(最近Cuda8.0用にバージョンアップされた)

         

 ステレオカメラで入力したデータを分析して、右側で取り込んだ画像の深度=距離を確認できます。画像の鮮度やスピードに関しては言うことありません。(TX1では1080X720 30fpsが限度みたいです)現状TX1では、OpenCV側のバグでZED SDKがコンパイルできません。これも時間の問題。

 母艦1080GPU環境では、1080x720で60fpsがステレオ2画面で実現できます。今までのWebCamera 30fsと比較するとリアルさがぐっと増します。まるで空気まで表現できる様な感じでした。

 WindowsではZED fuというサンプルが実行できます。これって何かというと、ZEDで写した画像をタイムリーに3D画像に変換できて、ZEDを移動させると3Dデータが自動連結されるサンプルなんです。

         

        基本設定画面。ここからカメラを持って周囲のデータをを記録させる

         

       記録されたデータを3Dデータに変換。メッシュで確認もできてしまう!!

 去年あたり長崎大学が、ドローンを使って軍艦島の3Dデータを作っていたことが話題になりましたが、これを手元で実現できることになります。衝撃以外の表現が見つかりません。

 ちょっと金銭的に無理をすれば、最小の大きさで、画像深度も、ディープラーニングも、それに関連付けた外部センサーなんかも実用レベルで、しかも個人レベルで実現できるんです。なんて幸せな時代なんでしょうか。

f:id:TAKEsan:20161017200729j:plain

 

                                   では、また。

Intel Joule でビックリしたこと。

ビックリしたこと1

金額がEdisonの4倍超になった!! 高〜〜〜〜〜い。

f:id:TAKEsan:20160929203704p:plain

              Mouser 価格!!

ビックリしたこと2

見た目が重厚で所有満足度大。

f:id:TAKEsan:20160929203540j:plain

f:id:TAKEsan:20160929203433j:plain

 Joule本体は安っぽさが微塵もありません。Edisonは本体がアルミ箔で覆われているような感じだったので、価格差分高級感が増しました。おまけにアルミ製の放熱板までついてます。

f:id:TAKEsan:20160929203500j:plain

    ボード全体が何故か重い。価格が高そうな感じ。小さなLEDが多くて楽しそう。

 Kitのボードは、他のインテル製品と同様相変わらず大変クォリティがよろしい。Arduinoや馬鹿高いTX1用のサードパーティボードとは異次元。

ビックリしたこと3

スピードが速かった。

 pythonが標準で付いているので。前々回使ったPython用のテストを実行してみたら12秒でした。これはPi3やTX1(その後おかしいと思ってTX1のOSをバージョンアップしてから再計測したら11.5秒前後でした。つまりJoulと同等)の3倍以上になります。でも、蛇足ですがIntel i5やi7の方がJouleの2〜4倍以上早いのも確か。消費電力の差を考えたら、こんなもんでしょ。iPhone7が発売になりましたが、向こうはARMの発展版なので、早くなったとしてもCPU性能はこちらの方が多分上です。

 消費電力は確認してませんが、Iot制御を主目的にしてるなら既存のボードの中で、CPUスピードでは最速の部類じゃないでしょうか。(TX1はGPUという名のバズーカを抱えているので比べ様がないけど、ものによってはダントツに早い)Pi3が来年あたりバージョンアップしてもこの開きは埋まらないことでしょう。

ビックりしたこと4

OSがイマイチでビックリした。

 やはりハードメーカーってことでもないんでしょうが、ソフトが全然追いついていません。8月のバージョンはバグがいっぱい。なんでこんなわけのわからないOSをつけたんでしょうか?。Yoctoの進化系ということで、Edisonと同じ使い勝手を想像してたのが、そこにも到達していないような、全く期待を裏切られました。今の所Ubuntuで言う所のapt-get すなわちopkgも全く使えません。なので汎用パッケージのインストールは今の所ソースをダウンロードしてコンパイルするしかありません(PIPはソースからインストールすれば大丈夫)。スピードがEdisonやPi3と違うのでコンパイル時間もあまり気になりませんがっ。このあたりが面白いっちゃー面白いんですが。

 そこでopkgのソースをダウロードしてコンパイルしてみましたが、ライブラリのバージョンが違う(GPMG1.0.0以上にしろとか)と怒られました。一筋縄ではいかないようなので、時期バージョンアップ待ち。今回のOSバージョンは、opkg関連の他のコマンド(opkg.pyとか)が使えるのでメーカー側が入れ忘れたか何らかの理由で諦めたかでしょうけど(私の知識不足だったらごめんなさい)。

 Joule発表時に取り上げてたUbuntuもWindows10もまだ公式に対応していません。(成功している人がいるようですがGPIOが使えないようです。今トライ中ですがうまくいきません)メーカーのコミュニケーション情報を見ると今年中とか。ハード発売をなんでこんなに急いだのでしょうかネ?

すごくビックりしたこと5

 詳細なインストール手順IoT - First-time setup | Intel® Softwareが作ってあるのですが、私が期待していた画像に関する詳細説明が全く無し。ディレクトリ内部を見てみると /usr/share にX11OpenCV が鎮座していて、OpenCVに関してはexampleのコンパイル済みバイナリファイルやPythonのexsampleが存在しています。

 もしやと思い、コネクタを買ってHDMIディスプレイを接続、そしてキーボードをUSB3に直結、再起動すると。

f:id:TAKEsan:20160929203341j:plain

f:id:TAKEsan:20160929203534j:plain

 なんとディスプレイにログが表示されて、キーボード入力可能!!。startx コマンドを試しに実行したら、Xwindow画面が現れるではありませんか!!。Pi3用IGZOでも汎用HDMIディスプレイでも。TX1には無いデイスプレイを選り好みしないすんなり感。

 USBカメラをつないで、このXwindow画面から

       /usr/share/OpenCV/examples/python/

に行ってpython video.py を実行してみたら、

         

 簡単に画像をキャプチャーしてしまいました。しかも表示のスムーズさは前回取り上げたゲーミングパソコン並み。CPU部分がPi3やTX1とは格段に違うんですから当然っちゃー当然ですけどっ。これって感覚的にGPIO付きの、ハダカの、超小型比較的高速パソコンです。

 なので今回最大のビックリ!! -------ちょっとXwindowが不安定のようですが..........。

 PiとかTX1とかなら当たり前の事ですが、Edisonをたくさん触ってた者とすりゃ、そりゃ驚きます。  

ビックリしたところ6

 取説の何気ないところに書いてあるんですが、何せ英文。Bootを説明通りSDカードにインストールしてもBios選択できません!!すなわち取説に書いてある選択の鍵となるF2キーをScreen接続では認識しないんです。いろいろ調べたら、キーボードはUSBコネクタに直付けしたらいいような.........。認識しました。最初からこう書けばいいのに。--->ただしF2キーだけ認識。他の操作はScreen接続した端末から。

 あと、SDカードは16Gしか受付ません。32Gも64Gも全然ダメでした。メーカーがScanDiskの最速SDカードでもですよ。

 本体付属の超遅い16G SDカードは正常にBoot可能(当然内蔵eMMCも)。それ以上のメモリが必要な場合は、USBしかダメっす。USBメモリにインストールした各種OSを使い分けるには超便利。でも今の所サポートOSは1種類のみ。

 OSをインストールしたUSBメモリは、Edisonの初期の頃のように作業領域が小さく固定されている(全体で4G以下)ので、容量の大きなUSBメモリを使うには、要拡張。他のUbuntuパソコンのGパーテッドで簡単に拡張できました。

 その他

 非常にわかりにくかったのですが、WifiSSH設定は簡単につながりました。 SSH接続状態は反応が鈍くならないので、Pi3やTX1よりWiFiチップの性能がいいような。

 いろいろ変なことを書きましたが、感覚的に基本性能はさすがです。この機器の本領を発揮するのは、時期OSのバージョンアップと、Ubuntuがリリースされた時の様です。とってもすごくなりそうな予感❤️ ってことで 今日もおしまい。 

その後さらにビックリしてしまうこと。

 この記事を書いた当時は、開発環境に落胆して、Intelに今後を託した感じになりました。海外のWebページを読み漁りながら、ほぼ自力で2ヶ月後には、こうなることになります。 

takesan.hatenablog.com

 基本性能の良さが功を奏し、もうiMacUbuntu母艦はいらない感じ!!。と言ったらビックリしていただけマスでしょうか。

 

 

ROBOX のDual Material Head キットがやっと来た。

思い起こすこと今年の1月半ば。

ROBOXの2色ヘッドをイギリスに注文したのは。それがやっと9月22日に到着しました。あー長かった ちょうど8ヶ月かかりました。

f:id:TAKEsan:20160923215029j:plain

                一見交換が簡単そうだが実は.....。

f:id:TAKEsan:20160923215136j:plain

       ちょっとノズルが汚れているノーマルヘッドとピカピカのDual Material ヘッド

 日本では先月あたりからCGコミュニケーションズさんが取り扱い始めたようです。

 3回ほど催促メールを出したのですが、自分たちもブログで書いているように、小さな会社なのでしょうがないですね。でも結構良心的な返信メールでした。

 Robox本体は、あまりにも売れすぎて(歯科大学が大量に買い占めたとか)イギリス国内では、本体もここ1ヶ月くらいBack Oder状態の様です。 

 届いたものは、ヘッド交換だけかと思いきや、完全なキットで、本体はおろかヘッドのベースまで分解して交換。部品内容を見て恐れおののいてしまいました。(上記写真右側の小袋と、中央のフレキシブルケーブルががクセモノ)

交換方法は動画を見ながらです。

   www.youtube.com

ケースのばらし方がわからなかったのですが、比較的簡単にバラバラになることがわかりました。ただし両側面に関しては力技が必要です。くれぐれもカバーを壊さないように

 バラして組み上げるのに、3時間くらいかかりました。結構重い本体を逆さにしたり、横に倒したりしながら分解していかなければダメなので、腰が....。中身を開けて気付きますが、まー良くできてます。大昔Civicのエンジンルームを改造しているような感覚。

 ROBOXはそもそもセンサーや、ステッピングモーターがてんこ盛り。Dual Material Head キットの組み込みは、規模の大きなロボットを作っているような感覚なので、私の工作欲求が解消されてしまいます。

 一番分かりにくかったのはヘッドのベースで、下の写真のフィラメントを通す2個の金属部品。これは2mmの六角ドライバを差し込んで、ネジ切りしていないヘッドベース部品の穴にかなり力を入れて固定します。見た目が円形なのに奥の方が6角形になってました。(ビデオを見ても何を使ってるのかわかんない)

f:id:TAKEsan:20160923214926j:plain

結局使った工具は

f:id:TAKEsan:20160923221731j:plain

 このほかにラジオペンチとROBOX付属のピンセット。右のドライバセットは上の金属部品を取り付けるためだけに購入(首が細く長くないとダメ)。

とりあえず完成したものの........

 電源を入れても内部照明すら点灯しません。本体の価格を考えると、サーッと血の気が引いていきました。こんな時は即電源OFF。焦げた匂いがしないのでとりあえずは大丈夫そう。

 しょうがないので、フィラメントローダー2個、ヘッドへ供給している信号線と電源を切り離し再度電源、すると 照明が点灯。

f:id:TAKEsan:20160923215427j:plain

         このLED照明が点灯したらひとまずすべての配線がうまくいっている合図

次に、フィラメントローダー再接続-->照明が点灯!!。

ヘッドコネクタ接続-->照明つかない。(ヘッドへの電源は不安なので点検が済むまで接続しない)

ってことでヘッドからみの問題なのが発覚しました。

 ため息をつきながら一番大変なヘッド部品のバラし。また本体の大部分をバラバラにしなければなりません。ヘッドベース(上の写真中ドライバ群の上の黒いプラスチック部品)の中身を付属のアルコールクロスで丹念に清掃。コネクタ類を再点検。特にヘッドに供給している電源は逆だとオシャカになるので再々点検。危なそうなヘッドとベースの接触部分も丹念に清掃。ドライバで少しゴシゴシ。一応全部組み立てないで、コネクタ接続。照明が...............ついた。

 動くこと間違いなし!! と自分に言い聞かせることに。やっぱどっかのコネクタがの接触がうまくいってなかったことになります。ですからこれからの方はこの辺りにご注意を。

 メーカーからの説明がありませんが、今回の経験上、どうやら電源スイッチを入れて本体内部のLEDが点灯するかどうかが成功の鍵のようです。

f:id:TAKEsan:20160923215247j:plain

2個目のフィラメントはもともと本体についているフィラメントホルダを延長しておんぶしている感じ。大概のサードパーティー製フィラメントが取り付けられそう。外部に別ホルダを置くと印刷中の管理(からまってしまわないように)やスペース確保が大変なんですが、これなら納得。

というわけで、この点検作業が+2時間。

  本体がかなり小さい上に、可動部が集中しているので、年寄りには一苦労。結構おもしろーござんした。

f:id:TAKEsan:20160923214851j:plain

       小さな空間にステッピングモーター5個。モーターの下にはCPU基盤

 おかげさまで、以前のヘッド修理と、今回の大改造で、次にトラブっても直せる自信がつきました。

 組み立て中は、けっこうせっかちな性格なので、かなりラフに扱っていましたが、ほとんど印刷物に影響がありませんでした。組み立て精度の正確さが要求される3Dプリンタですので、ここまで内部に変更を加える必要のあるキットをすべてのユーザー対象に販売していることを考えると、各部の自動調整機能にかなり自信を持ってるんでしょうね。

 取り付けたDual Materialヘッドは、ノーマルヘッドよりシビアな調整が必要なようです。特にキャリブレーションは何度も実行して、最良にするのがベターです。

 で、やっとなんとかなったパージマテリアルです。ヘッドに溜まった古いフィラメントを新しいものに変える自動機能ですが、ちゃんと交互に吐き出しています。

f:id:TAKEsan:20160923214816j:plain

ノズルアライメント(ヘッドのXY方向調整)試験も2色出力してました。

f:id:TAKEsan:20160923215353j:plain

 2色分けしたモデルを作るのがめんどくさいので、本体とサポートで、色分けしてみました。

f:id:TAKEsan:20160923215210j:plain

3Dプリンタでよく使われるこのモデルは、かなり意地悪に作られています。出力モードは、NOMAL。もう少し調整が必要。黒いところはサポートです。本来は水に溶けやすいサポート用フィラメントを使えば、普通の3Dプリンタでは不可能な造形もプリント可能となるはず。

 前にTグレースフィラメントを使った時、段差が極端でも美しいと感じるものができる経験をして以来、3Dプリンタに関しては詳細な再現性にあまり意味を感じなくなりました。

 プリンタの基本性能さえよければ、フィラメントを使い分けることと、モデルの作り方でいかようにもなるんですからねー。

 そういった点では、2種類のフィラメントを簡単に使い分けられるので、すごく楽になりました。

f:id:TAKEsan:20160923215102j:plain

一応前に使ったテストモデルをノーマル(右)とファイン(左)で出力。0.4mmヘッドになったので少し雑になるかとは思っていたが、感覚的には0.3mmヘッド比較してと大きな変化はなし。印刷スピードはノーマルヘッドと同じようでした。

前のヘッド簡単に使えるんでしょうか?。

 ヘッドの構造やフィラメントの送り出し方法が全く違うので疑問だったのですが、見事にパス。ヘッドを自動判別して、すぐにプリントを開始しました。ただしキャリブレーションは必要です。そうそう。ノーマルヘッドでは、使えるフィラメントは1種類だけです。でもこれで、当初の狙い通り3種類の太さが違うノズルを簡単に使い分けできることになりました。

f:id:TAKEsan:20160923215350p:plain f:id:TAKEsan:20160923215347p:plain

         左がDual Materialヘッドで右がノーマルヘッドを交換した時

 ROBOXを手に入れてから、他の機種の取り扱い説明などを冷静に眺めていますが、プリント開始方法、フィラメント挿入方法や調整も、改めてすごく簡単であることを感じています。

 唯一不便なのは、安全のためベッドが冷えないと蓋が開かないこと。また分解して鍵を取っちゃえばいいことなんですけど。急いでいるとちょっとムカついてきますが、今回はあーよかったということでおしまい。

 

                               では また。

 

 

 

ゲーミングパソコンでDigits 実行環境の整備

 以前私のiMac にCaffeをインストールしています。スピードは練習用としてはそこそこだったのですが、すぐにGPUモリーが不足してしまい、サンプルプログラムさえ工夫をしなければ、まともに動かないことが発覚していました。

 ディープラーニング勉強中の身としては、Caffeを簡単に実行できるDigits環境がどうしても欲しくなります。ちょうどTX1ボードが、使っている最中に電源チップから煙が出てきて、電源部がオシャカになったので修理中。確認だけでも1.5か月かかるとか。腹を立ててもしょうがないので、以前Macbook用に買ったSSDも余ってるし、思い切って生命保険を整理見直しして、とりあえず資金を集めゲーミングパソコンを手に入れることにしました。

 個人レベルで中身も弄くり回せて現状現実的でスピードの早いもの。i7 6700K +GTX1080が入ったゲーミングパソコンを物色。結果こんなのを入手。f:id:TAKEsan:20160916225656p:plain「Lev-C017-LCi7-VNS」。驚異の戦闘力だそうです。BTOでCPUをi7 6700Kに変え、メモリを16Gに変更、さらにHDDを追加。3日くらいで到着しました。基本的に市販部品の組み合わせなので、自分で拡張可能です。

 昔買ったPower Macのミニタワーが大きすぎて印象が最悪だったので、BTOゲーミングパソコンとしては一番小さくてGTX1080が動作可能パソコンを選択。

 ケースが小さくなると当然GPUが1つしか刺せませんが、資金はこれ以上一切出せない状況になったので、これで良し。3年間使用したiMacが壊れたら次期ホストマシンにすることにしました。

 単精度浮動小数点演算指標がiMacのGTX675MX=1.152TFlopsに対してGTX1080は8.9TFlopsとのこと。単純に7倍くらいの差があることになります。実際どうなのかはとても興味深いところですが、少なくてもCaffe実行で今使っているiMacの3倍以上になれば、とても快適になるはず。GPUメモリも8G積んでいるので少し大きめの画像学習もなんとかなるでしょう。

 果たしてゲーミングパソコンで実用的なニューラルネットワークが実現可能かどうかが一番のネックですけど...........。

 Webを調べると、ゲーミングパソコンはニュラールネット構築にはあまり勧められないような記事が結構多いので不安ですが、所詮パソコンの内容は同じ。部品の耐久性だけの問題。と割り切ることにしました。

 届いたパソコンに、ほとんど使わなかったintel SSD 480を取り付けて見ました。

  f:id:TAKEsan:20160916225659j:plain    f:id:TAKEsan:20160916225658j:plain

 

f:id:TAKEsan:20160916225657p:plain

           矢印部分が手持ちSSD。取り付けはとっても簡単

 すでに電源コネクタなんかも配置されてて、SATAコネクタも添付されているので。増設はいたって簡単。標準のSSDWindows用に、さらにハードディスクは2分割してWindows10(D)デッキとUbuntu14.04に。そして増設SSDは別のUbuntu14.04だけとし、トリプル起動させるように設定しました(単純にOpencv3.1と2.4を使い分けたいだけです)。

 OSの選択方法が疑問でしたが、パソコン起動時にF11を押して起動ディスクを選択すればOK。スムーズに選択できてます。Ubuntuインストールは Macで慣れてしまっているのでとても簡単でした。

 まず本体の動作スピードですがIntel i7ってとても進歩してます。いつものpythonスピードテスト(この方Shibu's Diary: PyPyよりも5倍高速な最速のPython処理系

が作ったシンプルなプログラムですが、シングルコアのスピード確認方法として重宝してます)

import time

def fib(n):

   if n <= 1: return n

   else: return fib(n-2) + fib(n-1)

def entry_point(argv):

   a = time.time()

   result = fib(36)

   timespan = time.time() - a

   print result

   print timespan

   return 0

def target(*args):

   return entry_point, None

if __name__ == "__main__":

   import sys

  entry_point(sys.argv)

 

 私自身i7の進化は期待していなかったのですが、想定外でした。確かPi3≒40秒前後、iMac10.8 4.76秒に対して今回のマシンは3.2秒でした。何回実行しても3.2秒前後。(iMacは前にCaffeをインストールした時anaconda環境に変えたので2倍くらい遅かったみたいです。後からPython2.7.12を再インストールしたら4.76秒になりました。anaconda要注意!!2016.9.26 Pi3やTx1はもう一度試してみます。TX1についてはPi3と比較して、クロックスピード分程度の速度差と記憶してます)

 クロックスピードの違いを加味しても、ARM系のCPUとIntel i7では処理スピードに圧倒的な差があることがよくわかります。

 これであれば遅いことで有名なPythonもサクサクのはずです。また、3年前の3.4 GHz Intel Core i7と4.0GHz Intel Corei7 6700Kとではクロックスピード向上程度の進歩がありました。

 CPUスピードアップに伴いLinux環境も非常に良くなって、Pi3やTX1(Pi3より確実に早いが不安定)と比較してサクサク感は、水アメと水の差くらい違います。スピードが極端に上がることで、今まで「おもちゃ」にしか見えなかったフリープログラムのlinuxアプリがOSXWindowsと肩を並べてしまう事が新鮮な驚きでした。

 インストールしたubuntuは、14.04です。16.04もインストールしてみたのですが、OpenCVやCaffeのインストールがどうしてもうまくいかないので止めました。新しいものを使いたいのは山々ですが、いじくりまわすには安定している14.04に軍配が上がります。

最初にCuda8.0rc、Cudnn5.1、グラフィックスドライバをUbuntu環境にインストール。

素人がCaffeを使ってDeepLearningしてみた(導入編) - Qiita

を参考にさせていただきました。

 GTX1080の該当ドライバは、Cuda8.0rc、Cudnn5.1、Nvidia370.28グラフィックドライバです(Nvidia367.44でも可能)。

 準備はCuda8.0rc(本体とパッチプログラム2本) とCudnn5.1をNvideaからダウンロード。

 手順はグラフィックドライバインストール->Cuda->cudnn->グラフィックドライバ重ね書きです。Cudaをインストールすると確実に画面がおかしくなるのでRebootする前にグラフィックドライバを重ね書きしておきます。上記2本のDEPファイルおよびCudnnの解凍済みファイルと、下記赤部分を記入したシェルスクリプトファイルを作って1つのフォルダに入れておくと後々すごく便利。

sudo add-apt-repository ppa:graphics-drivers/ppa

sudo apt-get update

sudo apt-get install nvidia-370

sudo apt-get install mesa-common-dev

sudo apt-get install freeglut3-dev

 これを最初に実行することで、画面解像度やloginできなくなった時、後から簡単に元に戻すことが可能(設定->ソフトウェアとアップグレード->追加のドライバーを開けると確認できます。別の端末からssh接続してsudo apt-get install nvidia-367 --reinstallを実行するだけ

 そうそう。一番最初にsudo apt-get sshsshをインストールしてreboot。他のコンピューターからSSH接続してから、その端末で以下を操作する方法が最良だと思います。

sudo apt-get --purge remove nvidia-*

sudo dpkg -i cuda-repo-ubuntu1604-8-0-rc_8.0.27-1_amd64.deb

sudo apt-get update

sudo apt-get install cuda

sudo apt-get remove --purge -y cuda-repo-ubuntu1604-8-0-rc

sudo dpkg -i cuda-misc-headers-8-0_8.0.27.1-1_amd64.deb

sudo cp cuda/lib64/* /usr/local/cuda/lib64/

sudo cp cuda/include/* /usr/local/cuda/include/

sudo apt-get install nvidia-370 --reinstall

(9/29 追記:Cuda8.0が変更になって、パッチファイルがなくなり1本になりました。上記はubuntu16.04用のCudaを14.04にインストールしちゃってます。グラフィックドライバがおかしくなるのはこのあたりかもしれません。新しいCudaは画面正常!!)

これらが無事インストールできたら

sudo nano ~/.bachrc で最後に以下を追加書き込み。

export PATH=/usr/local/cuda-8.0/bin${PATH:+:${PATH}}

export LD_LIBRARY_PATH=/usr/local/cuda-8.0/lib64${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}

export LD_LIBRARY_PATH=/usr/local/lib${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}

export CUDA_HOME=/usr/local/cuda

保存してから、

sudo reboot

 今回の経験上、Nividiaドライバ関連は、runファイルでインストールしない方が画面がおかしくなる等、パニックにならないで済む様です。

 最初はグラフィックスドライバーがインストールされていないので画面が荒いのですが、ここを我慢して上記の通り必要ファイルを全部入れておきます。リブートしてから、画面が詳細モードに変わっていればOK。

 注意しなければならないのは、これらドライバを入れてから  sudo apt-get upgradeすると「cuda8.0ドライバが必要無くなったので sudo apt-get autoremoveして下さい」と出力されことです。が、ほっときましょう。autoremoveを実行してしまうと、せっかくインストールしたCaffeやOpencvが動かなくなります。他のソフトをインストールして不要ファイルが更に溜まって来た時はしょうがないので、autoremoveしてNvidiaドライバ関連を入れ直します(結構めんどくさい。だからシェルスクリプト!!)。どうやらNvidiaの優秀なソフトエンジニアの皆様は最終的に個別OSの実行確認をしていない様です。

次にOPENCV

 OpenGL OPenCL CUDA qt5関連も全部入れてしまいました。これでOpencvのexampleは全て実行可能になります。

 ビルド時一番の注意点はCUDA_ARCH_BINの番号。散々エラーが出て悩みましたが、GTX1080は6.1を指定すれば簡単にインストールできることが分かりました。

 まず依存ファイルインストール。Caffe分も含めて多分これで全部です。python-opencvは故意に外してあります。

sudo apt-get install qt5-qmake

sudo apt-get install qt5-default

sudo apt-get purge python-pip

wget https://bootstrap.pypa.io/get-pip.py

sudo python get-pip.py

sudo add-apt-repository universe

sudo apt-get update

sudo apt-get install cmake git aptitude screen g++ libboost-all-dev \

libgflags-dev libgoogle-glog-dev protobuf-compiler libprotobuf-dev \

bc libblas-dev libatlas-dev libhdf5-dev libleveldb-dev liblmdb-dev \

libsnappy-dev libatlas-base-dev python-numpy libgflags-dev \

libgoogle-glog-dev python-skimage python-protobuf python-pandas 

 

 何でもかんでも入れちゃいます。そしてお好きなバージョンのOpencvをダウンロード。

 解凍してOpencvのフォルダに移動しますが、Opencv3.1.0を入れたい場合は、Cuda8.0を使うためのソース変更が必要です。これで簡単に3.1.0がインストールできます。(2.4.13は修正不要)

nano modules/cudalegacy/src/graphcuts.cpp で45行付近

#if !defined (HAVE_CUDA) || defined (CUDA_DISABLER)

をこれに変える

#if !defined (HAVE_CUDA) || defined (CUDA_DISABLER) || (CUDART_VERSION >= 8000)

だけ。あとは通常どおり

mkdir build

cd build

cmake -DWITH_CUDA=ON -DCUDA_ARCH_BIN=“6.1” -DCUDA_ARCH_PTX="" -DENABLE_FAST_MATH=1 -DCUDA_FAST_MATH=1 -DWITH_CUBLAS=1 -D WITH_OPENCL=ON -D WITH_QT=ON -D WITH_OPENGL=ON -DBUILD_TESTS=OFF -DBUILD_PERF_TESTS=OFF -DBUILD_EXAMPLES=ON -D BUILD_opencv_python2=ON -D PYTHON_EXECUTABLE=$(which python) ..

sudo make -j8

sudo make install

 ワーニングが多少出ますが、すんなりコンパイルできます。ビルド中観察して見てるとOpencv2.4.13の方がNVCCを使う時間が多い様な...。感じ。コンパイルできたら、以下を直すことでopencvを使ったgpuやcコードで書かれたソースが

  g++ 該当ソース.cpp `pkg-config --cflags opencv` `pkg-config --libs opencv`

だけで簡単にコンパイルできます。

----------------------------------------------------

sudo nano /usr/local/lib/pkgconfig/opencv.pc

以下朱書き部を追加

# Package Information for pkg-config

prefix=/usr/local

exec_prefix=${prefix}

libdir=${exec_prefix}/lib

libdir3rd=${exec_prefix}/share/OpenCV/3rdparty/lib

includedir_old=${prefix}/include/opencv

includedir_new=${prefix}/include

Libs: -L${libdir} -L${libdir3rd} -lopencv_shape -lopencv_stitching -lopencv_objdetect -lopencv_superres -lopencv_videostab -lippicv -lopencv_calib3d -lopencv_features2d -lopencv_highgui -lopencv_videoio -lopencv_imgcodecs -lopencv_video -lopencv_photo -lopencv_ml -lopencv_imgproc -lopencv_flann -lopencv_core -lopencv_ts

----------------------------------------------------

 opencvのexample実行形式ファイルは、全部build/example に作られるんですね。知らんかった。

 それとpythonopencvライブラリは自動でインストールされたりされなかったりしますがOpencv/build 以下に作られたcv2.soを所定の場所にコピーすれば動きます。特にCaffeではPythonOpencvバージョンを合わせなければならないので注意。コンパイルが無事完了したら強制的に以下を実行して、ビルドされたcv2.soをコピーしてしまいます。

sudo cp ~/opencvフォルダ/build/lib/cv2.so /usr/local/lib/python2.7/dist-packages/

 ちなみにpythonビデオキャプチャープログラムは爆速でした(cv2.4.13=camera.py cv3.1.0=video.py)。

次にCaffeインストール。

これは簡単。Nvidia のCaffeソースをダウンロード。

https://github.com/NVIDIA/caffe

中のMakecaffe.config.example をMakecaffe.configと名前を変えるかコピーして以下の様に直します。

----------------------------------------------------

## 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).

# cuDNN version 4 or higher is required.

USE_CUDNN := 1

# NCCL acceleration switch (uncomment to build with NCCL)

# See https://github.com/NVIDIA/nccl

# USE_NCCL := 1

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

# cuDNN version 4 or higher is required.

# 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

# Uncomment if you're using OpenCV 3

# OPENCV_VERSION := 3

# 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 \

# Uncomment to use Python 3 (default is Python 2)

# PYTHON_LIBRARIES := boost_python3 python3.5m

# PYTHON_INCLUDE := /usr/include/python3.5m \

 /usr/lib/python3.5/dist-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 /usr/local/include /usr/include/hdf5/serial

LIBRARY_DIRS := $(PYTHON_LIB) /usr/local/lib /usr/lib /usr/lib /usr/lib/x86_64-linux-gnu /usr/lib/x86_64-linux-gnu/hdf5/serial

# 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

----------------------------------------------------

Opencv3.1.0を使う場合は赤い部分のコメント#を外すだけです。

あとは

make all -j8

make test

make runtest

を実行。RuntestでエラーがなければOK。

Pycaffeのインストールは以前の記事参照 

takesan.hatenablog.com

次にDigits

  Digitsの説明にUbuntuでは apt-get install digits だけでインストール可能と書いてあるのですが、これをインストールするとCudaが7.5が勝手にインストールされて、GTX1080を取り付けたパソコンでは、OpencvもDigitさえもまともに動かなくなります。もしインストールしてしまったら慌てずにremoveして再度上記のCudaドライバー郡を再インストールします。

 そんなわけでGTX1080を使用する場合、Digitsはソースからインストールする必要があります。DigitsではTorch7も使えるのでついでにインストールしてみました。これも簡単。

Digit自体のインストール

https://github.com/NVIDIA/DIGITS/blob/master/docs/BuildDigits.md

Torch7のインストールと設定

https://github.com/NVIDIA/DIGITS/blob/master/docs/BuildTorch.md

最後に

./digits-devserver --config

でDigitsにCaffeとTorchのパスを指定します。

     caffeは~/nvcaffe/ 等

     Torch はパスではなくPを入力すると良いみたい

更に

Digitsフォルダにある実行ファイルでテストをしてエラーがなければ完了。

./digits-test

が、最初はPythoonのライブラリがないと叱られます。表示された該当ファイルを1個 pip でインストールし、再度 ./digits-test

で、少し時間がかかりますが、OK。

Disitsの実行は、./ digits-devserverです。

 Digitsをインストールしたコンピューターがサーバーになっちゃいます。Lanケーブルをつないで、涼しいところにコンピュータを置いておけば、他のコンピュータからDISITSを実行できます。

 Macでは、SSH、サファリ、ForkLiftが実行できれば、CaffeやDISITSが遠隔操作できちゃいます。本来はこんな使い方を想定してるんでしょうね(GPUを2枚以上つけたコンピューターで)Disitの使い勝手は、素晴らしいものでした。

いよいよCaffeの実行スピード。

ここまでが長かった。

 僕のようなCaffe素人がGPUスピード比較する手段は、やっぱりCaffe標準のMnistがどれだけ早いのかですが、

 結果はなんと13秒Macの4.6倍でした。ヒェー!!。終了まであっという間。ちなみにTX1の16倍!!です。

        

                 早っ!!

次にDigitsでMnist。

DIGITS/GettingStarted.md at master · NVIDIA/DIGITS · GitHub

 これはepocを標準の30から12に変えます。こうするとCaffe標準と同等になるとのこと。認識結果も99%なので良しとしますが、この時のスピードは15秒。Web画面なので少しオーバーヘッドがあるようです。それでも早い。

        

 このソフトの良いところは学習結果を試せること。適当な手書きファイルを指定すると学習結果が試せます。学習中でもですよ!!

さらにobject-ditection 学習テスト。

DIGITS/examples/object-detection at master · NVIDIA/DIGITS · GitHub

を参考に設定していきます。これは1248x384のカラー画像6373枚の学習です。

 画像変換に4分弱程度。 実際の学習は、1Epoch 30分強くらいで 30エポック16時間必要。24時間回しっぱなしでは50エポックくらいの学習が可能です。このくらいだと個人レベルでは十分なスピードです。私のiMacGPUフル稼働で実現できるとすれば64時間つまり3日必要!!。CPUオンリーで実行すれば極端な話、まさに天文学的な学習時間になります。GTX1080はやっぱり早い。

 問題はGPU温度。今回のGPUカードはNvidia標準の冷却システムですが、ずっと82度のままで、実行スピードを調節している模様です(DigitsでCPU,GPUの稼働状況がチェックできる)。CPU温度は水冷だけに問題外でした。一応8時間程度の試験をしてみましたが、まったく異常ありませんでした。

 GPUボードについては、さらに冷却能力を上げているものが市販されているので、そちらをチョイスするのがベターかもしれません(今回選択したBTOパソコンでは選択できませんが)。ただ、今までのNvidia新製品発表経緯では1年ごとに処理能力が2倍くらいになってますので、GTX1080の寿命が来る前に差し替えすることになるでしょう。 

 Nvidiaではアーキテクチャのシナリオができていて、小出しに新製品を出しているのでは?って感じがします。

 TITAN X Pscalが発売されたようですが、能力は1080の1.2倍程度。消費電力がUP。メモリーだけは魅力的な12Gです。8GのGTX1080でも今回テストしてみたカラー画像学習をメモリオーバーなく処理できるので、価格差を考慮すると私にとってTITAN X Pascalは将来手に入れてもあまり意味がありません。

 消費電力の比較的少ないGTX1080を積んだパソコンでも学習中は300W超くらいになります。経済的に見て個人レベルでの実行では、パソコンとエアコンの電気代を考えるほうが先です。

 こんな結果になったってことは、ゲーミングパソコンでもなんとかなると思いません?。故障しても自分でパソコンを修理できるのが最大の強みです。と、自己満足して今日の記事はおしまい。

眠いんでおかしなところは後で書き直し。まずは近況まで。

Pi zero はどれだけ使えるか?

PimoroniからPi zeroを取り寄せたので

 今回はOSがインストールできていることを前提として、Pi zeroがいったいどのくらいの実力があるか探って見ました。使ったセンサーは,WebCameraと以前WROOM-02の記事を書いた時に取り上げたFLIR Lepton赤外線カメラです。尚スピード的に不利になるので日本語環境はインストールしていません。

実行はエネループ充電池使用。

 プログラムを作っている時は別として、今回の実験は全てパナソニックバイル電源2,900mAhを使ってみました。少なくても2時間以上問題なく動作します。

f:id:TAKEsan:20160809103337j:plain

Openframeworksをインストールして、いつもの3Dテストを実行。

         

    結構早い!!。これならなんとか使えそう。(3DPrimitivesExampleの実行結果)

 開発環境は、使い慣れてきたOpenframeworksを使用。Openframeworksのインストール詳細は、raspberry pi | openFrameworksを参照。最初にRaspberry Pi Configurationを起動して、i2c,spiをON。さらにGPUモリーを128Kbに設定後、以下のコマンドを実行します。

sudo apt-get clean

sudo apt-get update

sudo apt-get upgrade

cd

wget http://openframeworks.cc/versions/v0.9.3/of_v0.9.3_linuxarmv6l_release.tar.gz

mkdir openFrameworks

tar vxfz of_v0.9.3_linuxarmv6l_release.tar.gz -C openFrameworks --strip-components 1

cd /home/pi/openFrameworks/scripts/linux/debian

sudo ./install_dependencies.sh

make Release -C /home/pi/openFrameworks/libs/openFrameworksCompiled/project

 Pi3と比較してビルドにかなり時間がかかるので、気長に終わるのを待ちましょう。ご存知のように高速なグラフィックやサウンド関連のアプリが初心者でもサクサク作れます。

FLIR Lepton公開ソースを使ってサーモグラフィーを作る。

         

          標準のソースをコンパイルすると画像が荒い。

 FLIR Leptonサーマルカメラは、メーカーで公開しているソースをコンパイルすると、上記のようなサーモグラフィーが簡単に実現できます。ただし、画像が荒く最低最高温度が表示されないので、面白くないのも事実。このソフトはQt4を使っています。サーモグラフィーの特徴が端的に表れるのは、物体を掴んだ時。手を離すと物体に移った体温が指の形を保ったまま徐々に消えて行くところです。以下FLIR Lepton Hookup Guide - learn.sparkfun.comを参考に以下の手順でインストール。まず配線ですが、この記事通りだとSPI通信がうまくいかないので、下図のようにCSを一つ上にずらすこと(CLKの直右に刺す)。

             f:id:TAKEsan:20160809103336p:plain

 記事に従って以下のようにインストール&実行(現状の公開ソースは内容が多少変わっている)。sparkfunの記事中で画像が表示されない場合は、センサーを入れ直すような説明があるが、非常に危ない(高額センサー破損の危険)ので絶対実行しないこと。CSの変更で確実に画像が表示されます。

最初にRaspberry Pi Configurationを起動して、SPI,i2cを使える状態にしてから、以下のコマンドを実行。

sudo apt-get install qt4-dev-tools

unzip LeptonModule-master.zip 

cd LeptonModule/software/raspberrypi_video

qmake && make

sudo ./raspberrypi_video

さらに解像度を上げる。

 Qtに慣れていないので少し苦労しましたが、過去WROOM-02の記事にも書いたように、解像度を2倍に補間すると、かなり詳細に表示できるようになります。ただし、 ディスプレイ接続ではPi zeroの機動性が生かせません。Pi zeroをWebサーバーにして動画として配信できれば、iPhoneでもMacでもPi3でもブラウザで確認できるのに......。

         

 画像解像度を上げるには、修正したソース LeptonThread.cpp 直 をダウンロード(急いで作ったので効率的に書き換えるのも面白そう。まだまだスピードを上げる余地あり)。上記raspberry_videoディレクトリの中にあるLeptonThread.cppに重ね書きしてから、qmake && make 、sudo ./raspberry.videoで再コンパイル&実行。

Openframeworksを使ってサーモグラフィー画像をJpeg配信してみる。

 ちょうど1年くらい前に紹介したofxHTTPと上記ライブラリを利用して、Jpeg配信できました。これだとPi zeroの機動性が存分に発揮されます。おまけで、画像中の最高・最低温度も表示させました。以前作ったiPhone+WROOM-02の環境に比べて大幅にスピードが上がる上にソフト作成はPi zero側だけでOKなので、かなりお手軽です。iPhoneテザリングを有効にして、Pi zero側のWifi接続先をiPhoneに設定すれば、外出OK。

 単なるカメラ画像ではなく、Openframeworksで加工した動く画像をどのようにしてMJPEG配信させるか疑問だったのですが、ofFboを使えば簡単に配信できることが分かりました。今回は試しにLEPTONの動画と、温度を確認するための文字を合成しています(画像の拡大も同時に実行している)。これを応用すれば、メモリーの許す限りOpenframeworksで作った魅力的な画像をほとんどすべてMJPEG配信できることになります。スピードの速いPi3とクラウドパイを組み合わせると面白そう。ofxHTTPとofFBOを利用したMJPEG配信については、次に説明する私の作った自作ソースダウンロードファイル中にあるofApp.cppを見れば確認できます。簡単。

       

                               

左のディスプレイはPi zero直結(配信画像とイーサネッット経由接続数を表示)。右はiMac中央はiPhone上のサファリでPi zeroの配信している画像を表示している。結構刺激的です。単独で画像を表示しながら同時に画像配信をしていることを考慮すると、この種のlinuxボードとしては納得のスピードです。しかもソフト中ではSPI通信で受け取ったグレースケールデータの解像度を2倍に補間。そして4倍に拡大して表示。さらにカラー変換。i2c通信で取り出したセンサーチップ温度から画像中の最高最低温度の計算結果をリアルタイムに表示させ、複雑なMJPEG配信までさせるという頭がこんがらかってしまうような処理がPi zero単独でできてしまってます。

実行方法ですが、OpenframeworksへofxHTTPライブラリ(addon)の追加が必要です。

GitHub - bakercp/ofxHTTP: A suite of HTTP tools, including clients and servers.を参考に、

Openframeworksのディレクトリに入って

cd addons

git clone https://github.com/bakercp/ofxIO

git clone https://github.com/bakercp/ofxMediaType

git clone https://github.com/bakercp/ofxSSLManager

git clone https://github.com/bakercp/ofxTaskQueue

git clone https://github.com/bakercp/ofxNetworkUtils

git clone https://github.com/bakercp/ofxJSON

git clone https://github.com/bakercp/ofxHTTP

さらに私の自作ソース LEPTON.zip 直 をダウンロードして解凍したら、フォルダごと

cd ../apps/myApps

の中に入れて、

cd LEPTON

make

make run

 make に30分以上かかるのでここでも気長に待ちましょう。make runは実行コマンド。binフォルダの中に実行ファイルができているので、X Window からダブルクリックしてもプログラム実行可能。一度makeすれば、ソースの修正等、再makeはさほど時間はかかりません。

 Pi版Openframeworksの良いところは、本来持っているスピードと、ssh接続した端末からでもPi zero本体の画像アプリを実行(Pi zero側でX Windowを起動しなくても良い)できることです。これは上記画像で確認できますが、CPUに負担が掛らないので、非力なPi zeroには断然有利です。方法があるのでしょうが、Qtで作ったアプリはXwindow上からしか実行できません。

 ofxHTTPを使ってWeb上でPiのIOも操作できるみたいですが、また今度。

最後に感想

 すごいですね、Pi zero。安い上に開発環境もスピードもEdisonやWroom-02(ESP8266)を完全に上回っています。専用のWifiとUSB拡張ボードをつければ、IOT制御では相当な実力ですぞ。

 

NVIDIA Jetson TX1 のOSをバージョンアップしたら実行すること

f:id:TAKEsan:20160724140822j:plain

変なソフトをインストールして、

OSが起動しなくなり、OS再インストールついでに、今回はインストール手順を再確認してみました。今までは結構勘違いがあったので、見つけ出しては前のブログを更新していたのですが、あまりにもめんどくさいのと今後の自分のために、OSバージョンアップ又は再インストールしたら実行すべき内容を書いてみました。

今回は現時点の最新版「JetpackL4T 2.2.1(2016/07/22)64bit版」のインストールが完了しているものとします。

Embedded Download Center | NVIDIA Developer

これはJetpak2.2をバージョンアップしたもので、TX1に直接影響はないみたいです。

少なくともOpenCV、SimpleCV、WebCamera、が問題なく使えて、Caffe、Torchがすんなりインストールできる環境作りを目指しています。

※その後Jetpack2.3になって、格段に性能が向上(私も!!)してます。Torchが正常にインストールできないようですが興味のある方はどうぞ。

takesan.hatenablog.com

 

手順と注意点

OpenCV4Tegraは、どうしても正常にWebCameraの実行ができない(Cでコンパイルしたものはエラーが出るものの画像表示できるとか、Python関連の画像表示できないとか)のでOpenCV2.4.13でのCUDA実行環境をインストールすることにしました。

JetpackL4T 2.2.1はOpenCV4Tegraがプレインストールされていない様なのでちょうどいいかも。一応

sudo apt-get purge libopencv4tegra

sudo apt-get purge libopencv4tegra-devubuntu

を実行してOpenCV4Tegraを削除する。プレインストールされていなかったらメッセージが出る。OpenCV4Tegraを入れたければ~/home/OpenCV4Tegraに入って sudo ./ocv.sh を実行。そうすると、現状でWebCameraは使えない。

 日本語環境にしないこと。apt-get updateにエラーが出て、修正が大変だったり、最悪Xwindowが頻繁にフリーズしたりします。

まず依存ソフト

sudo apt-get install nano Unity-tweak-tool nautilus-open-terminal  <--お好みにより

 

sudo apt-get purge python-pip

wget https://bootstrap.pypa.io/get-pip.py

sudo python get-pip.py

 

sudo add-apt-repository universe

sudo apt-get update

sudo apt-get install cmake git aptitude screen g++ libboost-all-dev \

libgflags-dev libgoogle-glog-dev protobuf-compiler libprotobuf-dev \

bc libblas-dev libatlas-dev libhdf5-dev libleveldb-dev liblmdb-dev \

libsnappy-dev libatlas-base-dev python-numpy libgflags-dev \

libgoogle-glog-dev python-skimage python-protobuf python-pandas \

libopencv-dev

OpenCV2.4.13

OpenCV3.0以降でも良いかもしれないが、これだとSimpleCVが動かないので2.4.13にした(OpenCV4Tegraと同バージョンの模様)。SimpleCVが必要なければ3.0以上でOK。ただしcmakeオプションは違うと思うので確認必要。

以下の記事を参考。依存ファイルがダブっているところがあるが、インストーラが無視してくれるのでそのまま。

http://elinux.org/Jetson/Installing_OpenCV

 

sudo apt-get -y install build-essential make cmake cmake-curses-gui g++

sudo apt-get -y install libavformat-dev libavutil-dev libswscale-dev

sudo apt-get -y install libv4l-dev

sudo apt-get -y install libeigen3-dev

sudo apt-get -y install libglew1.6-dev

sudo apt-get -y install libgtk2.0-dev

ここからOpenCVインストール先は私はSDカードにしましたが、どこでもOK

wget http://downloads.sourceforge.net/project/opencvlibrary/opencv-unix/2.4.13/opencv-2.4.13.zip

unzip opencv-2.4.13.zip

cd opencv-2.4.13

mkdir build

cd build

cmake -DWITH_CUDA=ON -DCUDA_ARCH_BIN="5.3" -DCUDA_ARCH_PTX="" -DENABLE_FAST_MATH=1 -DCUDA_FAST_MATH=1 -DWITH_CUBLAS=1 -DBUILD_TESTS=OFF -DBUILD_PERF_TESTS=OFF ..

sudo make install

一応CUDA関連を追加(GPUオプション)、コンパイルがすごく長い(約1H 。特に50%以降のNVCCコンパイル部分)。CPUを複数使ったMakeではメモリーオーバーになるので-jオプション無し。PythonOpenCVライブラリも同時にインストールされるのでpython-opencvのpipインストールは必要無し。最後にパスを.bashrcに追加

echo "# Use OpenCV and other custom-built libraries." >> ~/.bashrc

echo "export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib/" >> ~/.bashrc

source ~/.bashrc

最後にリブート。

SimpleCV関連

sudo apt-get install python-pygame

sudo pip install https://github.com/ingenuitas/SimpleCV/zipball/master

sudo pip install ipython[notebook]

Python関連

sudo pip install flask

sudo apt-get install python-smbus                                        <---i2cのpythonライブラリ

 https://github.com/derekstavis/python-sysfs-gpio  <---ここからGPIOライブラリのインストール

 

Caffe

git clone https://github.com/BVLC/caffe.git

cd caffe

cp Makefile.config.example Makefile.config

nano Makefile.config

以下入れ替え(赤書き部分)

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

 

# Uncomment if you're using OpenCV 3

# OPENCV_VERSION := 3

 

# 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++-4.8

 

# 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_53,code=sm_53 \

-gencode arch=compute_53,code=compute_53

 

# 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 \

 

# Uncomment to use Python 3 (default is Python 2)

# PYTHON_LIBRARIES := boost_python3 python3.5m

# PYTHON_INCLUDE := /usr/include/python3.5m \

#                 /usr/lib/python3.5/dist-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  /usr/include/hdf5/serial/

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

 

# N.B. both build and distribute dirs are cleared on `make clean`

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 ?= @

 

make all -j4

make test -j4

make runtest

コンパイルからruntestまでTX1では1時間以上必要。実行スピードは早い。make all -j4 実行中ワーニングが全く出ない。runtestはしなくてもエラーなし。(時間のある方はどーぞ。

pycaffeのインストール

上記makeが終了したら、pycaffeをインストール。これも最初に依存ファイルをインストールしているが、前とダブっていれば無視してくれるので、気にせずにこのまま実行。

cd python

for req in $(cat requirements.txt); do sudo pip install $req; done 

sudo apt-get install python-dev python-numpy python-skimage

cd ..

make pycaffe

 

nano ~/.bashrc

以下1行を最後に付け加える。

export PYTHONPATH=~/caffe/python:$PYTHONPATH

上記~/は自分のインストール環境による。

Torch

curl -sk https://raw.githubusercontent.com/torch/ezinstall/master/install-deps | bash

git clone https://github.com/torch/distro.git ~/torch --recursive

cd ~/torch; ./install.sh

これもコンパイル時間が長い。ワーニングがたくさん出る。

nano ~/.bashrc

以下2行を最後に付け加える。

export PATH=~/torch/bin:$PATH;

export LD_LIBRARY_PATH=~/torch/lib:$LD_LIBRARY_PATH;

以下が無かったら付け足す

. ~/torch/install/bin/torch-activate

上記~/は自分のインストール環境による。

この辺りでちゃんとライブラリがインストールできているか確認

テスト前にシステムリブート。

Torchは端末からからthと打ち込んでTorch画面が表示されればOK。

特に注意するのは、SimpleCVとpycaffe。この2つは依存ライブラリが多く、正常にライブラリがインストールされていないとエラー表示となる。また、OpenCV2.4.13インストールで実現できているはずのOpenCV Pythonライブラリがインストールできているか確認(cv2はpip listで確認できないため)。

Pythonを起動して、

python

import cv2

import caffe

import SimpleCV

th、caffeにエラーが出る場合は、.bashrcにパスを記入していない場合が多い。

SimpleCVでライブラリ不足の場合は、エラーメッセージに従いライブラリを再インストール。TegraCVや、OpenCV3.0以降のPythonライブラリをインストールした場合は、 SimpleCVインストールは不可。

実行環境確認ソースと実行方法

OpenCV確認

WebCameraを使うソースは、ソース中のカメラディバイスを 1又は/dev/video1に変更又は実行ファイルに1を明確に指定(ソースによる。以下laplaceは1に指定する)。何もしないとエラー。

 今回OpenCVのCmakeオプションにSampleコンパイルを指定していないので、もしすべてのサンプルをコンパイルしたい場合は OpenCVフォルダ/samples に入って

cmake .

sudo make -j4

で c,cpp,gpu サンプルソースが全部コンパイルされる。以下個別にコンパイルする場合。

cppソース 

画像を表示するプログラムなので、以下SSH接続したパソコンからは実行できません。

OpenCV2.4.13フォルダに入って

cd /samples/cpp

g++ edge.cpp -lopencv_core -lopencv_imgproc -lopencv_highgui -o edge

(Or for OpenCV 3.0: g++ edge.cpp -lopencv_core -lopencv_imgproc -lopencv_highgui -lopencv_imgcodecs -o edge)

./edge

f:id:TAKEsan:20160724140355j:plain

           フォルダに入っている画像を使ったcppサンプル

こちらはWebCameraをUSBに接続してから。

g++ laplace.cpp -lopencv_core -lopencv_imgproc -lopencv_highgui -lopencv_calib3d -lopencv_contrib -lopencv_features2d -lopencv_flann -lopencv_gpu -lopencv_legacy -lopencv_ml -lopencv_objdetect -lopencv_photo -lopencv_stitching -lopencv_superres -lopencv_video -lopencv_videostab -o laplace

./laplace 1

f:id:TAKEsan:20160724140354j:plain

                                            WebCameraを使ったcppサンプル

gpuソース

cd ../gpu

g++ houghlines.cpp -lopencv_core -lopencv_imgproc -lopencv_highgui -lopencv_calib3d -lopencv_contrib -lopencv_features2d -lopencv_flann -lopencv_gpu -lopencv_legacy -lopencv_ml -lopencv_objdetect -lopencv_photo -lopencv_stitching -lopencv_superres -lopencv_video -lopencv_videostab -o houghlines

./houghlines ../cpp/logo_in_clutter.png

f:id:TAKEsan:20160724140353j:plain

フォルダに入っている画像を使ったGPUサンプル。CPUとGPU実行スピード比較 1ライン認識にGPUが2.5倍ほど高速。ただしGPUクロックスピードを上げると19倍!!。嘘だと思ったが何度やってもそうなる。早い。

GPU版顔認識ソースコンパイル方法は上記参照。実行は事前にカメラを接続して、

./cascadeclassifier --camera 1 --cascade ../../data/haarcascades_GPU/haarcascade_frontalface_alt.xml

一括コンパイルをした場合は

./gpu-example-cascadeclassifier --camera 1 --cascade ../../data/haarcascades_GPU/haarcascade_frontalface_alt.xml

これは、640X320の白黒画面。GPU動作させても下記SimpleCV320X240と同程度の認識スピード。画面そのものの大きさが違うのは理解できるが、SimpleCVテストはインタプリタであること、フルカラーでインターネット経由であることを差し引くと、同程度の速さは納得できない。TX1の画像表示ルーチンが怪しい。OpenCVのhaarcascade関数自体が遅いのかもしれない。

Python ソース

cd ../python

nanoで camera.py を開き capture = cv.CaptureFromCAM(1) と変更(0はダメ)

python camera.py

 

 

f:id:TAKEsan:20160724140823j:plain

 WebCameraを使ったPythonサンプル。GPUクロックスピードを上げると、表示スピードが上がる。こうなるとカメラ表示に関してはPythonで十分。

NVIDIA_CUDA_7.0_Samples

OSをインストールするとHOMEに入っているが、そのままではライブラリのパスが通ってないので、エラーが出て実行形式ファイルが作れない。

.bashrcに

export LD_LIBRARY_PATH=/usr/local/cuda-7.0/lib64:

を追加。

コンパイル方法は、各サンプルフォルダに入ってmakeとタイプするだけ。

Python Simplecv

直接画面出力可能だが、ここではMjpeg配信サンプル確認。

ssh接続したPCから実行可能。ユーザー名はtgra-ubuntuと仮定。先行してUSBにWebCameraを接続しておくこと。

別のPCまたはスマートフォンからWebを開き、tegra-ubuntu.local:8090 入力。

以下 mjpeg画像配信のみ。 xxxx.py として保存 実行は python xxx.py

from SimpleCV import *

import time

import commands

c=Camera(1, { "width":320, "height":240 },True)

js = JpegStreamer("tegra-ubuntu.local:8090")

while(1):

  img=c.getImage()

  img.save(js)

  time.sleep(0.02)

以下 リアルタイム顔認識。(顔を認識すると顔を四角で囲む)yyy.py として保存 実行は python yyy.py こちらはかなり複雑な処理をしているはずだが、これだけ。320X240程度の表示であれば、スピードもほぼ問題なし。

from SimpleCV import Camera, Display,JpegStreamer,Color

import pygame,time

c=Camera(1, { "width":320, "height":240 })

js = JpegStreamer("tegra-ubuntu.local:8090")

xxx=pygame.Surface([500,250]) 

while True:

    img = c.getImage()

    img.drawText("Test!!", 0, 0, fontsize=40,color=Color().getRandom())

    faces = img.findHaarFeatures('face')

    print(faces)

    if faces is not None:

        faces = faces.sortArea() 

        bigFace = faces[-1]

        bigFace.draw()

    img.save(js)

 

Caffe、Torch動作確認

 以下記事参照。

takesan.hatenablog.com

takesan.hatenablog.com

 注意

Linux普段使いをしている方には説明不要と思いますが、.bashrcにライブラリリンクを書き込んでもリブートしないと設定が反映されません。すぐに反映したい場合は、直接コマンド入力すればOK。コピペで済むのでこれが一番簡単です。

 起動時にBlueToothをONにしたい時

.bashrc に

rfkill unblock bluetooth

を追加する。

Pi3よりかなりましだが、起動時認識がMacの様にスムーズでは無いので、入力ディバイスBluetoothオンリーというわけにはいかない。ディバイス側に節電モードが働いていると復帰できない場合あり。メイン入力ディバイスは有線または一般的な無線接続が無難。linuxでのBlueTooth接続はスピーカー、他のコンピュータ接続専用に割り切る必要あり。が、Xwindow上で簡単につながる。

GPUクロックスピードを上げる

NVIDIAのフォーラムに書いてありました。以下の内容でspeed.shで保存(名称はご自由に)実行は sudo sh speed.sh

#!/bin/bash
echo "Set Tegra CPUs to max freq"
echo userspace > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
echo userspace > /sys/devices/system/cpu/cpu1/cpufreq/scaling_governor
echo userspace > /sys/devices/system/cpu/cpu2/cpufreq/scaling_governor
echo userspace > /sys/devices/system/cpu/cpu3/cpufreq/scaling_governor
cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_max_freq > /sys/devices/system/cpu/cpu0/cpufreq/scaling_min_freq
cat /sys/devices/system/cpu/cpu1/cpufreq/scaling_max_freq > /sys/devices/system/cpu/cpu1/cpufreq/scaling_min_freq
cat /sys/devices/system/cpu/cpu2/cpufreq/scaling_max_freq > /sys/devices/system/cpu/cpu2/cpufreq/scaling_min_freq
cat /sys/devices/system/cpu/cpu3/cpufreq/scaling_max_freq > /sys/devices/system/cpu/cpu3/cpufreq/scaling_min_freq
echo "Disable Tegra CPUs quite and set current gov to runnable"
echo 0 > /sys/devices/system/cpu/cpuquiet/tegra_cpuquiet/enable
echo runnable > /sys/devices/system/cpu/cpuquiet/current_governor
echo "Set Max GPU rate"
echo 844800000 > /sys/kernel/debug/clock/override.gbus/rate
echo 1 > /sys/kernel/debug/clock/override.gbus/state
# burst EMC freq to top
echo "Set Max EMC rate"
echo 1 > /sys/kernel/debug/clock/override.emc/state
cat /sys/kernel/debug/clock/emc/max > /sys/kernel/debug/clock/override.emc/rate
echo 120 > /sys/kernel/debug/tegra_fan/target_pwm

ついでにファンも半分の回転数で強制的に回してます。GPUクロック変更を実行すると画面表示のレスポンスが時間とともに低下するので注意。表示上遅く(カクカクする又は画像が飛ぶ感じ)感じますが、CPUクロックが低下しているわけではないので、内部では早くなっています。したがって画像直接よりmjpeg配信した方が動作が早い場合あり。

TX1は、特にGPUスピードを上げなくても、徐々に画面のレスポンスが悪くなります。今は気にしないで、Jetpackの次期バージョンに期待しましょう。

 

                                        以上

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倍くらいの差がありますね。ただしポケットサイズでは最強!!

       

 

                            では、 また。