Take’s diary

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

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

       

 

                            では、 また。

 

 

 

NVIDIA JETSON TX1 を最小構成で動かしてみる。

そもそもTX1自体はかなり小さなボード

 なので、本来の機動性を生かすため、接続ボードを探して購入してみました。必要最小限のコネクタ、GPIO、i2c、UARTを持ったボード

     f:id:TAKEsan:20160626211802p:plain

 CTI Orbitty Carrier for Jetson TX1 です。定価は、約170$ !!、さらに送料手数料が約120$!!!!!!、さらにさらに日本の税関から1200円の追徴金!!!!!!!!!、とても信じられないくらいの恐怖のボードでした。この価格でもTX1は当然付いてません。対象は企業向けなんでしょうね。くれぐれも請求予想金額をよく確認してから購入すること。degi-keyとは諸費用が雲泥の差です(アメリカから5日くらいで着きましたけど)。

 ただし、TX1の絶対数を考えるとしょうがないかもしれません。ま、

愚痴はさておき、本題へ

f:id:TAKEsan:20160701220515j:plain

普通に使っている限りは、触った感じはPi3ほど熱くならない様な.....。放熱板を外すと高さがグンと縮まります。平面的にはPi3より少し小さい。

 まずSATAインターフェイスは搭載していないので、必要ファイルはSDカードへ(caffe,Toch7など)コピー。TX1は金属でシールドされているので、WifiBluetoothはアンテナ無しではつながりません。開発キットのアンテナがあまりにも不細工(大きなうさぎの耳)なので、コネクタのちょうど合うこんなのを(ZigBee平面アンテナ TWE−AN−P4208−100)秋月から2個取り寄せました。

f:id:TAKEsan:20160701220514j:plain

 もともとXBEE向けみたいです。XBEEコネクタを確認するとTX1とドンピシャ。最終的にはこんなにちっちゃいのに全く問題ありません。TX1用のアンテナには安いし絶対お勧め。

 開発ボードからTX1本体の差し替えは、ビスを外せば、軽く抜けるためチョー簡単で、Edisonの様にあまり気を使わなくてもOKでした。

 あと、このボードにTX1を接続すると、開発ボードとは異なり、ファンが回りっぱなしになります。ボードメーカーのホームページから、カーネルを再インストールしないとダメ。差し替えソフトは6/15付けでjetpak2.1用と書いてあり、危ないのでインストール中止にしました(私のは最新版2.2)。内容はfanのPWM制御だけなのに??。

GPIOとi2cのテスト

 NVIDAでは、先に販売されたTK1と私の持っているTX1では、まだ取扱方法について混乱があるらしく、Pythonで使うGPIOやi2cのライブラリについて一体何を使えば良いのか一切説明がありません。いつものように試行錯誤でやってみたら。今回のボードセットでGPIOは、ここから https://github.com/derekstavis/python-sysfs-gpioダウンロードしてREADME.mdの通りインストール。i2cはsmbus( sudo apt-get install python-smbus)で一応動きました。

 このボードについているGPIOは4本で3.3V出力。ボードのピン番号11〜14それぞれ187,186,89,202に指定すれば簡単にLチカができました。

from twisted.internet import reactor

from sysfs.gpio import Controller, OUTPUT, INPUT, RISING

import time

 

Controller.available_pins = [187, 186, 89, 202]

pin = Controller.alloc_pin(187, OUTPUT)

while True:

        pin.set()

        time.sleep(0.5)

        pin.reset()

        time.sleep(0.5)

# Controller.dealloc_pin(187) ===>Close!!

 i2cは、おきまりのi2cツール群をインストールしてから(sudo apt-get install libi2c-dev i2c-tools)sudo i2cdetect -y -r 1 でi2cアドレスを確認。その後 python-smbus をインストールします。i2cの接続確認は、いつものOMRON D6T赤外線非接触温度センサーです。前にもPi3関連で書きましたが、smbusライブラリのi2cバッファは32bit止まりのため、D6Tの温度測定ポイントである16個目のデータが、どんなに逆立ちしても読み込めません。テストと考えて諦めました。そうそう。システム関連のデータを変更することになるため、実行には「sudo」を付けることをお忘れなく。でも一般的なi2cセンサーならpython-smbusの標準関数でなんとかなると思います。

import smbus

import time

 

D6T_addr = 0x0A

D6T_cmd =  0x4C

tdata=

y =

i=0

x = smbus.SMBus(1)

 

while i<1000:

        x.write_byte(D6T_addr, D6T_cmd)

        y=x.i2c_read_device(D6T_addr, 35)

        for var in range(0, 16):

                tdata.append((y[(var*2)+2]+(y[(var*2)+3]<<8)))

        print tdata

        tdata=[]

        time.sleep(0.1)

        i=i+1

               OMURON D6T練習ソース

[268, 303, 301, 272, 271, 307, 311, 272, 276, 301, 309, 285, 300, 314, 313, 37421]

[268, 303, 301, 272, 271, 307, 311, 272, 276, 301, 309, 285, 300, 314, 313, 37421]

[268, 303, 300, 272, 272, 307, 311, 272, 276, 302, 309, 285, 300, 314, 313, 37422]

[268, 303, 300, 272, 272, 307, 311, 272, 276, 302, 309, 285, 300, 314, 313, 37422]

              実行すると最後の16個目が......。

とにかくUSBでカメラは繋がったし、i2c、GPIO、それにIGZOディスプレイも動作確認できました。まだ確認できていませんが2つ付いているUARTも問題ないと思います。でも本命は「ディープラーニング」ですから。

 続けて3本ほど記事を書いてしまいましたが、あまりの面白さにPi3やEdisonが霞んでしまいそう。

 資金不足になってしまったので、これからちょっとアルバイト。

 

                          1ヶ月後ぐらいに。また。

 

 

 

 

 

 

NVIDIA JETSON TX1 に Torch7をインストールしてみる。

前回に引き続き今度は

 JETPAK UBUNTU(64bit)をインストールしたJETSON TX1にTorch7をインストールしてみました。

 今回は早稲田大学の研究グループが開発したsiggraph2016_colorizationという学習済みモデルを実行してみます。白黒写真をデープラーニングでカラー化する素晴らしい研究ですね。実際に変換したのがこの写真です

f:id:TAKEsan:20160625205530j:plainf:id:TAKEsan:20160625205531j:plain

 私が4歳ごろ(昭和34年前後)に父が写した写真です。この写真はこのカメラで撮っています。

f:id:TAKEsan:20160626173011j:plain

 この時の様子はうっすら覚えていましたが、色までは思い出せません。カラー変換した写真はセピアがかっていますが、姉がピンクの手編みセーター。母が着ているものは白地に茶色の細かい千鳥模様ののジャケット。

 はっきり思い出しました。あのころ姉の上着を触った感覚や周りの匂いも色とともに蘇ってきます。母の若々しいこと!!。父は他界し、母は1時間前の記憶すら消えてしまう状態になってしまいました。当時の幸せな感覚を思い出すと目頭が少し熱くなります。老健施設のボランテアで使うと、皆さんとても喜ばれることでしょう。

Torch7のインストールはすごく簡単

    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

 これだけです。~/torchの所は自分のインストールしたい場所に変更してください。

NIVIDIAのフォーラムでTorch7インストールスクリプトが紹介されていますが、これはJETPAC32bit版なので、うまくいきません。上記コマンドだけで簡単にインストールできました。途中はcaffeと違ってワーニングが比較的たくさん出ますが、一応今の所問題ない様です。

 インストールが終わったら、.bashrc に以下の2行を書き加えて終了。

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

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

とりあえずrebootしたら、「th」 と入力してtorchの入力画面が表示されたらOK。

siggraph2016_colorizationのインストール方法は、以下参照

github.com

 torchのluaライブラリが必要ですが、標準インストールに入っていますので、今回はこの通り実行すればOK。

肝心の変換スピード

 32bit版では2.5Gというかなり大きなデータをここからhttp://hi.cs.waseda.ac.jp/~esimo//files/colornet_ascii.t7.bz2読み込む必要があり、1枚の写真を変換するのに3分25秒必要でした。今回の64bit版ではインストール時にダウンロードされるバイナリデータそのままでOK。実行時間は1分15秒でした。この差はデータの読み込み時間で、約2分に対して4秒程度で読み込みが完了します。実際の変換はほとんど差がなく、720x480ドットで約1分くらいでした。基本プログラムの応用で面白いものができそうです。

こんなボードも手に入れました

     f:id:TAKEsan:20160626211802p:plain

 

TX1が平面的にPi3より小さくなります。i2cやGPIO制御テストも兼ねて少し遊んでみようと思います。

 

                               では、また。

 

 

 

 

NVIDIA JETSON TX1 を動かしてみた!!

前回の記事から約2ヶ月

 その間にJETSON-TX1と言う、一昔前のGPU付きのパソコンが、PI並みに小型化されたすんごいボードを手に入れました。

f:id:TAKEsan:20160625205529j:plain

 ディープラーニング環境構築までかなり手間取ったのですが、一応入り口までたどり着いたので、記事にすることにしました。今話題のディープラーニングをドローンなどに組み込みやすくしたボードだそうです。ディスプレイにはPI用のIGZOディスプレイを使いました。

 今回はJetpack 2.2 Ubuntu(64bit)版でcaffeとtorch7のインストールと実行までをざっと書いてみます。Jetpack 2.1(32bit)との比較などもちらっと入れてみます。Jetpacとは、OS及びGPU関連のソフトとExample群がまとまったパッケージです。

まずMaclinuxデュアルブート

 母艦の対象は、64bit版ubuntu14.4 LTSです。余っていた外付けSSDを使いました。インストール方法は、ネット上で探してみてください。バーチャル環境ではJetpacがうまくTX1へ転送できないようです。さらに日本語化しない方がスムーズにインストールできました。 

 MacへのLinuxインストールが初めってだったのでかなり戸惑いました。Ubuntu母艦環境が構築できない方は、バージョンアップできないので、TX1を手に入れてもあまり意味ありません。

Jetpack64bit版をダウンロード

 といってもダウンロードされるのはスクリプトだけです。あとはマニュアルに沿ってインストール。勝手に必要ファイルをダウンロードしてくれます。

 TX1は一度電源を抜いて、POWERボタンを押した後、すぐリカバーボタンを押しっぱなし、続けてリセットボタンを押し、リセットボタンを離したら、2秒待ってリカバリースイッチを離すだそうです。多少タイミングがずれても順番がおかしくなければOKでした。

確認方法は lsusb コマンドをターミナルから入力して、Nvidiaで始まるUSB機器が接続されているかどうかです。これが確認できないと以下のインストールができないので注意。表示されない場合は再度TX1の接続をやり直してください。

 次にMacとTX1間を付属のUSBケーブルでつなぎます(付属のUSB3ケーブル)。ランケーブルはつながなくても、家庭内でWifi環境ができてればOK。その他には必ずHDMIディスプレイを接続しておくことが必要。(ただしWifiだとインストールに時間がかかります。以下Wifi環境でインストールしてます。)

インストーラを実行

 まず母艦に必要ファイルのダウンロードが実施されますが、時間帯によってはかなり遅くなります。問題なければ転送が始まり、終了すると自動起動されたターミナル画面表示が一旦止まります。(1回目は準備はどうですかなのでENTER

 この状態になる前に、エラーが出て先に進めない場合は、母艦のsudo apt-get updateを実行するとエラーが出ています。これを解決しないとTX1への転送が不可能になる(特にCUDA関連)ので母艦を調整する必要があります。ただし、サンプル関連だけが正常に転送できなくなるみたいなので、引っかかったインストール項目を外せばなんとかなります

 2回目で表示が止まったら、母艦からOSの転送終了後TX1が再起動されるので、Xwindow画面が出るまで気長に待ちます。この間TX1の画面が真っ暗なので不安になりますが、起動するまで5分ぐらい待ち、起動されたTX1で以下のことを実行。

  1. 設定からBrightr&locを選んで、画面がスリープされない設定にする。

       (ロックを抜け出す時、たまにマウスもキーボードも使えなくなる可能性あり)

  2. 表示画面を慎重に設定し直す(IGZO設定は回転や拡大設定が必要)

  3. ユーザーアカウントで Automatic login を必ずON

 どうやらTX1はIGZOとの相性が非常に悪く、これらを実行しないと再起動時、画面が真っ暗になり焦ります。その場合IGZOの電源を差し替えると多分表示されます。また、なぜか起動・終了時のログが表示されません。Pi3に接続したIGZOパネルは、表示が非常に遅かった記憶があるのですが、TX1では全く気になりません。Pi3の画像処理能力が追いついていないのでしょう。

 次にWifiの設定をTX1のXwindow上で実行します(ランケーブル接続しない場合)。で、ここまで終わったら母艦に戻ってENTER。母艦が自動的にIPを認識して、インストールがイーサネットに切り替わり再開されます。

さらに続けると

 途中フリーズしたように見えますが、動いてます。(TX1の該当フォルダを見てみると確実にファイル容量が増えていきます)ここで故障と勘違いして2回ほど初めからやり直してしまいました。これも相当時間が(長くて1時間)かかります。でやっと終了。ssh ubuntu@tegra-ubuntu.local (パスワードubuntu)で他のパソコンから接続が可能となります。

  ここら辺でTX1をapt-get update ,upgradeします。さらに最低限使いやすくするため、nano,Unity-tweak-tool、nautilus-open-terminalをapt-getでインストールしました。

caffe やSimpleCVに必要な依存ファイルのインストー

 新しく記事を書いたので、ここを参考にして下さい。時間はかかりますが、全部インストールすると、TX1のかなり手ごわいシステム構築に左右されないで、デープラーニングに専念できます。
takesan.hatenablog.com

Jetpack 64bit版の注意点

 32bit版では標準で付いていたfairfoxが付いていない(インストールしても動かない)。その代わりEpiphany Web Browserが付いています(Pi3のと同じ)。このブラウザは早いとかなんとか言われているのですが、Pi3では頻繁に止まり、だんだんスピードが落ちてくるので、私は好きじゃありません。だんだんスピードが遅くなるのはTX1も引き継いでいるようです。TX1の32bit版ではfairfoxがかなりいい線いっていましたので、今後のバジョンアップまで我慢。ちなみにChromeはインストールすらできませんでした。よく考えると、主にダウンロード用に使用するだけなので、今のままでも特に問題はありません。

 32bit版ではOpenCV4Tegraが、USB接続したWebCameraを認識しなかったのですが、64bit版も同様。WebCameraを使う場合は、標準OpenCVをインストールして、プログラム中でvideo1を指定すること。標準指定のvideo0では確実にエラーとなり、最悪システム全体がハングアップします。(これが分かるまで2日かかってしまいました。video0はどうやら開発ボードに付いているカメラのようですが、現状でOpencvから一般的な方法での接続は不可)修正すればOpenCV2.4のカメラを使用したexampleが実行できます。標準OpenCVPythonOpenCVインストールは上記私の記事を参考にして下さい。

 この後暫くしてから日本語環境にしてみましたが、頻繁にXwindowがハングしてしまうのでJetpacを再インストールする羽目になってしまいました。日本語環境にしないほうが安定して動くようです。

 OpenCVとは関係ありませんが試しにGPUを使ったCUDAサンプルプログラムを試してみると、こんな感じです。

       

 Pi3ではこんなことは絶対できません。すごい!!(金額もすごいけど)。無数の点の集まりを影付きで煙のように動かしています。

 TX1では32bit、64bitとも今の所Openframeworksは実行できません。(私としてはこれがかなりショック)

※2016/12 Openframeworksがインストールできました。ディープラーニングと合体させたらすごいことになりそう。 

                                 

 以下このボードの要、Caffeのインストール方法等を紹介します。まだNIVIDAホームページにも載ってませんので、かなり苦労しました(完了してみると大したことありませんが)。この時点で本体のeMMCは50%を超えてしまうので、SDカードへのインストールをお勧めします。開発ボードにはSATAコネクタも付いているので、余っているHDDなどがあれば、これにインストールしてもOKです。

TX1のGPUクロックレートを変更する方法が

https://devtalk.nvidia.com/default/topic/935300/jetson-tx1/deep-learning-inference-performance-validation-on-tx1/

に載っています。ここでは84480000Hzに変更していますが、他の記事を見るともう少し早くできます。つまり起動時の4倍になります。ただしこれを実行すると、画面の反応が相当もたつき出すので、画像を表示するソフトにはお勧めできません。(caffe,torch7等は問題無し。確実にスピード向上を実感できる)

※現時点(2016/11)ではJetpack2.3となり、video0の問題や画面のもたつきが解消された上に、動作スピードも大きく改善されています。この種のボードとしては、お世辞抜きで、最強になっていますので興味のある方は 、次の記事もどうぞ。
                                  

                                   

Intel Joule も確認してみました。ディープラーニングではTX1に完全に軍配が上がりますが、Ubuntuの使用勝手及びCPU性能はこちらの方が上でした。

                             

 Caffeのインストー

 今の所、本家のソースをダウンロードするのが無難です。NIVIDAで公開している32bit版のインストール方法

https://devtalk.nvidia.com/default/topic/935300/jetson-tx1/deep-learning-inference-performance-validation-on-tx1/

ではうまくいきません。(makeではなくmake all で一応コンパイル可能。またCUDA、cuDNNインストール部分は無視(この記事ではcuDNN32bit版をインストールしているため))。この記事の中のスピードTESTはかなり早く実行できるのですが、mnistなどの実行がfloat16ではできない。runtestもエラーが出て止まる。つまりかなり不安定=営業用でしょうね)これが実行できれば浮動小数点の精度を落としていてTX1ではスピード的にかなり有利なので、もう少し待つ必要がありそうです。しょうがないので、

      sudo apt-get install git

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

ダウンロードしたcaffeディレクトリに入ってMakefile.config.exampleをMakefile.config に変更して、

      #USE_CUDNN :=1 の行を

       USE_CUDNN :=1 コメントを外す

      # CUSTOM_CXX := g++ の行を

       CUSTOM_CXX := g++-4.8 

に変更しました。この後

       make all -j4

でインストール開始。この設定でCUDA+cuDNNを使った最速モードでCaffeがインストールされます。

 コンパイルは、途中でNVCCを使ってることが確認できます。これは、GPUを最大限使ったコードを生成するコンパイルということを意味します。逆にNVCCが全く表示されなかったら設定がおかしいということです。MAKE中はワーニングは全く出ませんでした。このコンパイルも結構時間がかかります(20分程度)。うまくコンパイルできたら、make test -j3   make runtest でセルフテストが始まります。

  セルフテストがかなり長いので、初めの10分程度テスト状態が正常に動いているか確認した後は、ほったらかしにしておくのが最善。ビルドに失敗していたり、GPUがメモリーオーバーの場合、この間に大概errorが出て止まります。一部記事には数分なんて書いてありますが、何せ2000回程度のテストをランダムで行いますので、TX1ではものすごく長~い。テスト内容とテスト回数は乱数で決めてるので、運が良ければ早く終了するかもしれません。(セルフテストの実行時間はCPUスピードに比例するようです。Macで試してみたら、半分程度の時間で終了しました。)

 異常なければ、以下の様に涙の終了みたいなメッセージが出て終了。

f:id:TAKEsan:20160625205747p:plain

 エラーがなければすべての操作は正常に実行できることを意味しているようです。ただし、Caffe実行中GPUのメモリオーバーとなった場合は例外。こんな時はXwindow画面を低解像度に変更したりして、なるべくGPUの負担を軽減してやれば上手く行く様です。CaffeのGPUメモリは4Gを想定しているそうですが、TX1はCPU・GPUメモリが共用で4Gらしいので、Caffeのexampleを実行する限りGPUのメモリオーバーエラーにはなりません。

Python用のCaffeライブラリインストー

 画面を操作する等、複雑な処理を行う場合は、スクリプト言語としてPythonを標準で使用する様です。(mnistなどで学習の確認などを行う場合は必要なし)

   sudo apt-get purge python-pip

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

   sudo python get-pip.py

   (sudo apt-get install python-pipだと後からエラーが出る)

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

            (caffe/pythonフォルダ上で実行)

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

   cd ..

   make pycaffe

 終了後 .bashrcexport PYTHONPATH=~/caffe/python/:$PYTHONPATH として環境変数を設定する必要あり。(~/caffe部分は自分の環境による)

この辺りで再起動して、python 上で import caffe を入力してエラーが起きなければ構築完了。

Caffe付属の例題

 面白かったのは web-demoです。これは、実際の学習済みデータを使ったものですが、実行方法は
github.com

 に書いてあります。最後のapp.py -hを app.py -g に変更すると、GPUを使った最速モードになります。事前に sudo pip install flask でflaskライブラリをインストーする必要があります。

 TX1がサーバーになり、他のコンピューターのweb上でtegra-ubuntu.local:5000と入力すると、手持ちの写真をTX1が勉強した成果を教えてくれます。ちなみに今回の64bit版インストール以前に実行した32bit版では、GPU指定なしで認識に4.73秒。(ちゃんとプードルと答えている。すごおおーい)

f:id:TAKEsan:20160625205752p:plain

GPUをONすると0.422秒!!. 確かNIVIDA推奨のFP16caffeのGPUクロック最速だったと思います。

 これが、今回の64bit、GPU84480000Hzだとなんと0.207秒!!!!!!!!!。左下の数値に注目。

f:id:TAKEsan:20160625205745p:plain

 この数値の凄さというのは、私のMacCore i7 3.4Ghz)は、TX1のCPUスピードと比較すると約3倍(Pythonの簡単なテストで比較)高速であるため、仮にMacのCPUのみでこの写真を認識させたとした場合、1.6秒必要となり、そうなると7.7倍高速ということです。

 MacでCUDA+cuDNNを稼働させた場合は、TX1の3倍以上早くなるでしょうが、この大きさでこのスピードであれば、現状文句を言う人はいないのではないでしょうか。(この記事を書いた20日後にMacにcuDNNをONにしたCaffeをインストールして確認すると、CPUモードで0.271秒、GPUオプション有りで0.161秒でした。CPUモードが異常に早くなっています。MacのCPUモードでweb-testを実行させたところ、タイミングによってGPUモリーオーバーエラーが出ます。ということは、Mac版ではCPUモードでも何らかのルーチンでGPUを使っている可能性があります。でもTX1のGPUってかなり効率が良いんですね=Mac-->0.161秒,TX1-->0.207秒GPUコア数は私のMacの1/4。

 ちなみにTX1でSimpleCVもインストールできましたので、前にEdison用に作った顔認識のソースを動かしてみたら、

       

 こんな感じでした。これはTX1から顔認識画像をMJPEG配信しているところです。Pythonで実行していることを考えるとスピード的には十分(当然ですがEdisonとは比べ物にならない)です。(先に書きましたがプログラムソース中のビデオディバイス番号は1にすること。USBにwevCAMERAを接続すると ls /dev の実行で、最後の方にvideo1が表示されます。くれぐれも0にしないこと!!)

 OpenCVcやgpuサンプルでWebCameraを利用するプログラムを実行してみましたが、全てもっさりした動きでした(バイナリなのにSimpleCVとほとんど変わらない!!)。特にgpu版の顔認識サンプルcascadeclassfier_gpuは白黒表示にもかかわらず、感覚ではSimpleCV(今回試したWeb経由画像表示320x180ドット-->ディスプレイダイレクトではない!!)に明らかに負けています。ディスプレイへの表示部分がもたつくようですが、原因は今のところ不明

 もしTX1をロボットなどに組み込んで画像を確認するとすれば、テザリングをONにしたiPhone等を利用することになると思うので、当面SimpleCVで十分というところでしょうか。

 以前SimpleCVの動画を少しの工夫でflaskで配信した経験があるので、web-testとSimpleCVを組み合わせれば、Pythonでも動画の認識が簡単にできそうです。しかも0.5秒以内で。面白そうですね。その前にCaffeの本格的な勉強が必要ですけど。

 Pythonのライブラリではcv2、SimpleCVでカメラが使えますが、なぜかこちらもSimpleCVの方が表示スピードが速いような気がします。

 Jetpackについて現状では、入出力ディバイスの反応について色々不満もありますが、頻繁にバージョンアップされているので、今後が非常に楽しみです。

※この記事以降Jetpackは2.3にバージョンアップされ、画面のもたつき、Cameraの動作についての不満は解消されました。さらにCPU、GPUについてもなぜかスピードがかなり改善されて、上記web-testもなんと倍くらい早くなっています。 

 次回はTX1にtorch7をインストールして、早稲田大学で開発した白黒写真のカラー化ソフトを実行させてみます。50年以上前の写真に感激しました。

                                 

 MacLinuxが動いても、MacファンとすればOSXでCaffeを動かしてTX1と連携させたいですよね。Mac OSX10.11.5にcuDNNを有効にした高速Caffeのインストールに成功しました。やはりすごく早かった...。

                               

 

                                では、また。

 

Openframeworks で Pi3 7" タッチスクリーン LCD のタッチ機能を有効にする。

今回のテスト画面は

標準のGUI addonを使ったソースに変更した前回のD6Tプログラムを実行させてみるとこんな感じ。

                            

 OF標準のofxGuiを使ってスライダーをタッチスクリーン用に作って見ました。反応もまずまず。OF標準GUIを大きく設定すると、タッチスクリーンでも確実にタップできます。デザインもそんなに悪くありません。

                         

   こちらはofxBox2dのexample。60fps出てます。早っ!!。タッチスクリーンだと結構快適。

 スピードが要求されるソフトを作る時はRaspberry Pi 7" Touch Screen LCDがGood!!。フレームレートが60fpsってことはIGZOパネルと比べて2倍。視野率とか発色もかなり良。最大の欠点は表示範囲が狭いことですが、それさえ我慢すれば、IGZOパネルと比べてWEBもかなり早く表示されます。

 で、今回は以前別の基盤(UDOO)を取り付けていたスタンドをPi3+Raspberry Pi 7" Touch Screen LCDに載せ換えました。私のブログのヘッダーにつけている写真の全体像です。

          f:id:TAKEsan:20160504221848j:plain

      アンティーク感満載!!。Xscreenseverが動き出すと部屋のオブジェになります。

f:id:TAKEsan:20160504225933j:plainf:id:TAKEsan:20160504221849j:plain

           でも裏側は、結構雑だったりして......。

 雑貨コーナーで買ってきた真鍮製6,500円のフォトフレームに、特注の電圧計(協和電気計器株式会社)を付けたもの。電圧計は3V Maxにしました。ワニ口クリップをつけてアナログピンのテストに使ってます。

 タッチ機能をOFで使うための設定

 Pi3でOpenframeworksを実行させるとしたら、このディスプレイを使うと実行スピードや発色、フォントの取り扱い等、使い易さが抜群です。

 これでタッチ機能が使えれば、Pi3で本格的に独立したアプリケーションが比較的簡単に作れます。GUIを工夫すればiPhone並みのアプリが作れるのではないでしょうか?

 設定方法は、前々回のところで説明しましたが、~/of_v0.9.3_linuxarmv6l_release/libs/openFrameworks/app/ofAppEGLWindow.cpp

の中身を変更するだけで済みました。

まずevtest をインストール

  sudo apt-get install evtest

インストールしたら

  evtest

f:id:TAKEsan:20160504212456p:plain

                evtestを実行している様子

 表示された「FT5406 memory based driver」のイベント名を調べます 私の場合は、念のためUSBマウスを接続しているので event3 であること確認できます。

 今回キーボードの設定は変えませんので、マウス部分だけを修正。まず安全のため、ofAppEGLWindow.cppのバックアップを忘れずに。

変更箇所は、コメントで「By TAKEsan」が書き込まれている以下14行です。(ofAppEGLWindow.cppのソースを変更)

f:id:TAKEsan:20160504211955p:plain

           110行付近 event-mouse を event○○ に変更

f:id:TAKEsan:20160504211953p:plain

            200行付近 mouSescaleX、Yを 1.0fに変える

f:id:TAKEsan:20160504211951p:plain

          400行付近 ここも、mouSescaleX、Yを 1.0fに変える

f:id:TAKEsan:20160504211948p:plain

        1350行付近 /dev/input/by-path をdev/input/ に変更。上記2箇所

f:id:TAKEsan:20160504211944p:plain

1670行付近 上記6箇所(By TAKEsan 部分)。上から、2行追加。次の2箇所も追加。この4箇所追加した部分がタッチパネル設定のキモ。次にコメントを入れ(ofLogNotice部分)、最後にBTN_LEFTを330に変更。見にくいですが拡大すると文字が見えると思います。

 あとは通常どおりコンパイルするだけで、マウスの代わりにタッチディスプレイが使えるようになります。

試しに openframeworkのexamplesからgui guiexample のフォルダに入って 

 make

 make run

してみると、GUIメニューが小さすぎて指では操作しにくいのですが、マウスの代わりにタッチスクリーンが確実に機能します。更にプログラム中でGUIの大きさを変えることでタッチ機能を存分に使いこなせるようになります。

f:id:TAKEsan:20160504221851j:plain

                  庭に咲いたチューリップがあまりにも綺麗だったので。

 

ではまた。

ROBOX で T-GRASE フィラメントを試してみる。

T-GRASE フィラメントって聞いたことありますか?

f:id:TAKEsan:20160425190113j:plain

          最終的に成功した造形物。結構魅力的。

 ガラスのような光沢で透明感のあるフィラメントです。PETボトルの再生フィラメントの一種だそうです。このフィラメントを手に入れたので早々試してみます。

f:id:TAKEsan:20160425185917j:plain


 設定温度は標準で212℃〜224℃、ノズルが太いほど透明感が出るとのことなので、ROBOXの太い方のノズルを有効利用するには最適と思い。試してみました。
 そもそも。ROBOXには2本のノズルが付いていて(0.3mm,0.8mm)、基本NOMAL出力をしている者としては、現状全く0.8mmノズルを活用していません。これを使うのにうってつけ!!。

 ただ、現行のROBOX専用印刷ソフトAutoMakerV2.0.3は、結構バグがあります。自由にフィラメントの温度設定ができない上に、層の厚さを0.6mm以上にすると最下層の固着に0.3mmノズルが使えないばかりかRaft、Brimが全く印刷できません(専用フィラメントは全く問題なし)。この点に関しては、今後のバージョンアップを待つことにします。
 このため、最下層がまともにベッド(印刷台)に張り付きません。T-GRASE向きの造形物が全く作成できない!!
 しょうがないので、層の厚さを0.5mm設定にしてみると、気泡がたくさん入って透明感が出ない(比較写真参照)。これじゃーなんだかってことで、いつものように試行錯誤してやっと成功しました。最終的なヘッドとスピードの設定は以下の通り。透明にするための設定がターイヘンでした。

f:id:TAKEsan:20160425190110p:plain

層の暑さは0.75mm。充填密度は一応0。ペリメータは1層。トップ、ボトムの層は0にします。モデルは円柱のような物を作って、側だけを印刷するイメージです。底面を2ぐらいにすると当然底も印刷できます。

f:id:TAKEsan:20160425193117p:plain

主要なノズルは0.8mmに設定。押し出し幅は1層目とペリメータを1.2mmにします。ここもバグで、保存しても0.5mmに変更されてしまうので、印刷をする前に絶対に確認する必要あり。

f:id:TAKEsan:20160425190142p:plain

     印刷スピードで変更できるところは、全てT-GRASE推奨の8mm/sにする。
 フィラメントは搭載フィラメントの検出のチェックを外して、ABSフィラメントを設定にして、

f:id:TAKEsan:20160425190139p:plain

左の材料選択部分をABSとする。(CO-PET他4種類の材料が選択できますがABSが最良。ABSの溶解温度が235度となりT-Graseの上限となりますが、ROBOXにジャストフィット)このフィラメントはものすごく温度に敏感で、少しでも違う環境になると、気泡が無数に入り透明度が全くなくなります。ROBOXの場合はABSのCrystal Clearである必要があるようです。この設定では同じABSでも印刷台とノズルの温度設定が10度程度低くなります。それでも室内温度によって気泡の入り方が全く違います。庫内温度をなるべく下げる必要があるようです。印刷中気泡が目立つようになったら、本体一時停止ボタンを押して1分程度放置して多少冷やしてから再開すると、なぜか気泡がなくなります。昨日までうまくいっていたのに、気温の高い今日がダメだということは、庫内環境に敏感だということか?。このフィラメント手強くて面白い。

f:id:TAKEsan:20160425185916j:plain

今回のフィラメント設置には、前にブロンズフィラメントを使って大失敗した時に作ったフィラメント台を有効利用。

 層厚は、0.8mm前後にすると良いみたい。ベッドに押しつけないで、材料を柔らかめにして、表現が悪いですが垂れ流しみたいに造形させる。ベッドにノンオイルのヘアスプレーを吹きかけると完璧に張り付きました。

f:id:TAKEsan:20160425185915j:plain

層の厚さの違いによるプリントの比較は、以下の写真。

f:id:TAKEsan:20160425185913j:plain

 

f:id:TAKEsan:20160425185914j:plain

 一番左から層厚0.5、0,6、0,85mmです。最終的に0.75mmに落ち着きました。これだと最下層(ボトム)の平面もなんとか剥がれないでプリントできました。
 層が厚くなるとさすがに綺麗です。スンバラシイ。魅力的な光沢が出ます。造形物は、サポートを必要としないなだらかな曲線を使う円筒形のものが良さそう(今回の設定では、細かさを追求する造形には全く向きません)。一般的なフィラメントでは気になる、層の段差を逆手に取った作品が向きそうです。ちなみにこのフィラメントと印刷設定の特性を生かした小物がこれ。イヤリングだそうですが、なかなかのものができました。ガラスの質感です。ノーマル印刷では表面の凸凹が鋭利になってしまいますが、今回の設定では作品の味になります。

f:id:TAKEsan:20160425190116j:plain

でもPLAの透明でもこの設定なら....。

 と思って、比較してみました。左側がPLA、右がT-GRASE。全く違うでしょ。透明のPLAもかなり健闘していますが、艶と透明度それに表面反射の質がGrase!!。T-GRASEにこだわらないで0.8mmノズルは他の有色フィラメントでも面白い作品ができそうです。

f:id:TAKEsan:20160425190115j:plain

他のカットを少し紹介。

f:id:TAKEsan:20160425190024j:plain

f:id:TAKEsan:20160425190113j:plain

f:id:TAKEsan:20160426083904j:plain

f:id:TAKEsan:20160425190112j:plain

f:id:TAKEsan:20160425195512j:plain

f:id:TAKEsan:20160425190025j:plain

 T-GRASEフィラメントは、他にグリーンとダークグレーがあります。ペリメータの数を2〜3にすると厚みのある魅力的な作品ができそうです。

4月29日追記

 この後色々試したのですが、どうしてもたくさん気泡が入って透明ではなくなります(層厚0.85mmにしても上記写真の層厚0.5mmにした感じ)。良く見るとちょうど水が沸騰するように、ノズルから出てきた瞬間、小さな泡が膨張して気泡だらけになってしまいます。環境温度の違いだと思ってたのですが、ノズルの温度設定が高すぎるような.....。

 問題は違うところでした。プリントプロフィールで新しい設定をする時、エクストルージョンで層の高さを変更すると、次のタブ設定「2つのノズル」の押し出し巾が1.2mmから0.5mmに勝手に戻ってしまうことでした。設定を保存する場合は「2つのノズル」タブを開いた状態にして押し出し幅を確認してからの方が良さそう。

 多分押し出し巾を小さく設定すると、エクストルーターがフィラメントの押し出し圧力を調整するため、高速に押したり引いたりして、高周期の振動が生まれ、ノズルの先端で気泡が入ってしまうのでしょう。太い方のノズルが影響を受けるようです。この現象はPLAやABSでは全く起こりません。T-GRASEは特に敏感のようです。結局フィラメントプロフィールは上記設定。フィラメントは、若干低め温度設定となるClear CO-PETに落ち着きました。この設定だと、ABSより印刷開始時間が早くなります。

この設定で、

eyesofanother.com

 ここのページと質感が全く同じのものができました。しばらくハマリそう。