Pascal世代GPUでのUbuntu14.04へのCUDAインストール

使用しているGPUは、GTX1050Ti(ELSA GeForce GTX 1050 Ti 4GB S.A.C)です。

まず、先にcuda-8.0をインストールします。

sudo dpkg -i cuda-repo-ubuntu1404_8.0.44-1_amd64.deb
sudo apt-get update  
sudo apt-get install cuda

この時点でNVIDIAドライバ(nvidia-361)も自動でインストールされます。
しかし、GTX1050Tiの要求するドライバはnvidia-375ですので、ppaからドライバを別途インストールします。

sudo add-apt-repository ppa:graphics-drivers/ppa
sudo apt-get update
sudo apt-get install nvidia-375

以後、apt-getを実行する度に以下のメッセージが表示されますが、cuda-8.0がアンインストールされてしまいますので、autoremoveは実行しないでください。

以下のパッケージが自動でインストールされましたが、もう必要とされていません:
  cuda-command-line-tools-8-0 cuda-core-8-0 
  ...
これを削除するには 'apt-get autoremove' を利用してください。

CUDAへのパスを設定します。

echo "export LD_LIBRARY_PATH=/usr/local/cuda-8.0/lib64:$LD_LIBRARY_PATH" >> ~/.bashrc
echo "export PATH=/usr/local/cuda-8.0/bin:$PATH" >> ~/.bashrc
source ~/.bashrc

サンプルを用いて、CUDAが実行できるか試してみます。

cp /usr/local/cuda/samples .
cd samples
make -j4

samples/3_Imaging/cudaDecodeGLにて、以下のエラーで落ちると思います。

/usr/bin/ld: -lnvcuvid が見つかりません
collect2: error: ld returned 1 exit status
make[1]: *** [cudaDecodeGL] エラー 1

3_Imaging/cudaDecodeGL/findgllib.mkの61行目を、UBUNTU_PKG_NAME = "nvidia-375"に修正します。
再度makeを実行することで、全サンプルがコンパイルできるはずです。早速実行してみましょう。

# GPUの詳細情報表示
./bin/x86_64/linux/release/deviceQuery
# 多体問題をGPUでシミュレーション
./bin/x86_64/linux/release/nbody
# 上記をCPUでシミュレーション
./bin/x86_64/linux/release/nbody -cpu

効果が得られやすい問題なのだと思いますが、GPUの恩恵が強く実感できます。

Ubuntu14.04 + Jetpack2.3.1によるJetsonTX1セットアップ

Ubuntu14.04 LTS日本語RemixでJetpack2.3.1を使って、JetsonTX1評価キットのセットアップを行いました。

Jetpackをホスト側で起動

ここからrunファイルをダウンロードします。
日本語名のディレクトリ以下で起動しましたが、インストール中に『Error occurs during installation Jetpack』と原因を何も言わずに落ちます。ここにあるように、ディレクトリ名に2バイト文字を含むとダメなようです。なお、英語名でシンボリックリンクを張ってもダメです。

# [NG] 2バイト文字を含むパスでJetPackを起動
ln -s ~/ダウンロード ~/download
cd ~/download
./JetPack-L4T-2.3.1-linux-x64.run
# [OK]
mkdir ~/jetpack
mv ~/download/JetPack-L4T-2.3.1-linux-x64.run ~/jetpack/.
cd ~jetpack/
./JetPack-L4T-2.3.1-linux-x64.run

以下、GUIに従ってインストールを進めていきます。

なお、ホストPCのCUDA等はJetpackでインストールしないほうが賢明です。JetPackではCUDAはインストールできますが、NVIDIAドライバはインストールされません。
ホストPCへのCUDAインストールはこちらの記事を参照してください。

JetsonTX1評価キットをリカバリモードで立ち上げる

ホストPC側のインストールが完了すると、評価キット側をリカバリモードで起動するように指示されます。
リカバリモードでの起動方法は以下の通りです。
 - JetsonTX1のシャットダウン → 電源ケーブルを外す → 電源ケーブルを挿す
 - micro USB B端子とホスト側のUSB端子を付属のケーブルで接続する
 - パワーボタンを押して離す→リカバリボタンを押す→リセットボタンを2秒押して離す→リカバリボタンを離す
 - リカバリモードに入れた場合、ホストPCでlsusbコマンドを実行すると、NVIDIA Corpと記載されたデバイスが認識されます
評価キット側へのOSインストールが完了すると、評価キットへのパッケージのインストールが始まります。ネットワーク構成とethを指定するとインストールが始まりますので、あとは待てばOKです。

JetsonTX1でCUDAを起動してみる

JetsonTX1側でセットアップを確認します。
ホームディレクトリ以下に種々のファイルが配置されます。

cd NVIDIA_CUDA-8.0_Samples
make -j4

Ubuntu14.04にChainer1.19.0インストール

対象は、CUDA8.0 + cuDNN5.1 + GTX1050Tiです。
CUDAのインストールはこちらの記事を参考にして下さい。

まず、cuDNNをインストールします。
NVIDIAHPからDLできます。DLには登録と簡単な質問への回答が必要です。
Download cuDNN v5.1 (August 10, 2016), for CUDA 8.0 → cuDNN v5.1 Library for Linux
を選択します。なお、Ubuntu14.04向けのdebパッケージもありますが、/usr/local/cuda以下でなく/usr以下にインストールされるため、使用しません。

tar xvfz cudnn-8.0-linux-x64-v5.1.tgz
sudo mv cuda/include/* /usr/local/cuda-8.0/include/.
sudo mv cuda/lib64/* /usr/local/cuda-8.0/lib64/.

次に、chainerをインストールします。
この記事を参考にしたのですが、途中、何度もエラーが発生してやり直したため、以下の手順通りに実行して実現できる保証はまったくありません。orz

# 下準備
sudo apt-get install build-essential
sudo apt-get install python3-dev
sudo apt-get install python3-pip
sudo pip3 install --upgrade pip3
sudo apt-get install libhdf5-dev
sudo pip3 install h5py
# chainerのインストール
sudo CUDA_PATH=/usr/local/cuda-8.0 pip3 install chainer --no-cache-dir -v
# MNISTサンプルの取得
wget https://github.com/pfnet/chainer/archive/v1.19.0.tar.gz
tar xvfz v1.19.0.tar.gz
# GPUを利用したchainer実行
python3 chainer-1.19.0/examples/mnist/train_mnist.py -g 0

当方の環境での実行結果は以下の通りです。

GPU: 0
# unit: 1000
# Minibatch-size: 100
# epoch: 20

epoch       main/loss   validation/main/loss  main/accuracy  validation/main/accuracy  elapsed_time
1           0.190735    0.0940083             0.94245        0.9693                    2.15671       
2           0.0747346   0.0865228             0.976149       0.9732                    3.97802       
...
19          0.00876789  0.100427              0.99735        0.9825                    35.1507       
20          0.00851457  0.113583              0.997449       0.9797                    37.0101       

nvidia-smiの結果も以下の通り、GPUが働いているのがわかります。

Sun Jan  8 00:17:58 2017       
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 375.20                 Driver Version: 375.20                    |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|===============================+======================+======================|
|   0  GeForce GTX 105...  On   | 0000:01:00.0      On |                  N/A |
|  0%   35C    P0    44W /  75W |    513MiB /  4067MiB |     70%      Default |
+-------------------------------+----------------------+----------------------+
|   1  GeForce GTX 105...  On   | 0000:02:00.0     Off |                  N/A |
|  0%   21C    P8    35W /  75W |     11MiB /  4070MiB |      0%      Default |
+-------------------------------+----------------------+----------------------+
...

なお、CPUでの実行は非常に遅いです。1エポックが終了した段階で 346.974s経過。
Pascal最弱クラスのGTX1050Tiですが、CPU(i7-6700)より約170倍も高速という結果が得られました。

UART経由でのJetson TX1の初期設定

GTCJapanで購入したJetson TX1評価キットを今更ながらセットアップしています。
使用しているディスプレイはEIZO SX2462Wですが、HDMI端子がありません。Raspberry PiなどHDMI出力が必要な場合は、HDMI→DVI-D変換コネクタを使用していました。

代理店からは『変換コネクタでも出力できるが、初期セットアップ時はダメな場合がある』と聞いていました。不安を感じながら試しましたが、初期状態では、やはり画面出力できませんでした。

そこで、まずUART接続を確立し、評価キットの初期セットアップすることでコネクタ経由でのディスプレイ出力を実現しました。

使用したUSBシリアルケーブルは、こちらです。出力レベルが3.3Vと5Vの2種類がありますが、3.3V対応品を使用します。
ホスト側の端末エミュレータにはC-Kermitを使用します。

まずは、ホストPCにケーブルを接続して認識していることを確認します。
この記事を参考にセットアップしました。

# USB接続デバイス一覧表示
$ lsusb
…
Bus 001 Device 011: ID 0403:6001 Future Technology Devices International, Ltd FT232 Serial (UART) IC
…
# USB接続の端末デバイスの一覧表示
$ ls /dev/ttyUSB* -al
crw-rw---- 1 root dialout 188, 0 1210 21:51 /dev/ttyUSB0

ここで、/dev/ttyUSB0がUSBシリアルケーブルを表しています。しかし、ユーザにアクセス権がありません。
以下の操作にて全ユーザに対してパーミッションを与えます。
なお、USBシリアルケーブルのIDは上記のlsusbで確認できます。ここでは0403:6001となっています。

# USBシリアルに対するルール作成
$ sudo vim /etc/udev/rules.d/50-usb-serial.rules
SUBSYSTEM=="tty", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6001", MODE="0666"
# ルールの読み込み
$ sudo udevadm control --reload-rules
# USBシリアルケーブルを挿し直し、パーミッションを確認
$ ls /dev/ttyUSB* -al
crw-rw-rw- 1 root dialout 188, 0 1210 21:51 /dev/ttyUSB0

次に、USBシリアルケーブルとJetson TX1評価キットを接続します。

この記事を参考にセットアップしました。
シリアルケーブル側は6pinのメス端子になっています。記事中では、J17の6pin端子に接続することもできると記載されていますが、このスレによるとJ17はカメラモジュールのUART端子のようです。実際、J17に接続してみましたが無反応でした。ジャンパーピンを使ってJ21の端子に接続します。

J21の端子一覧はこちらを参考にしました。

USBシリアルケーブルのコネクタと、評価キットの端子との対応は以下の通りです。

黒:9番 GND(39番など他もあり)
茶:11番 UART0_RTS#
赤:未使用
橙:10番 UART0_RX
黄:8番 UART0_TX
緑:36番 UART0_CTS#
なお、ボード上にGNDと記載されている端子が、39番のGNDになります。

C-Kermitをインストールし、接続を確認します。

# C-Kermitのインストール
$ sudo apt-get install ckermit
# 設定ファイルの編集
$ vim ~/.kermrc
set line /dev/ttyUSB0
set carrier-watch off
set speed 115200
set stop-bits 1
set flow-control rts/cts
connect
# 接続
$ kermit

評価ボードを起動すると、C-Kermit側でLinuxが起動するのが確認できます。なお、"Ctrl-\ c"で接続を切り、ホスト側に制御を戻すことができます。

最後に、Jetson側で以下のコマンドで初期設定を行います。

$ cd NVIDIA-INSTALL
$ sudo ./install.sh
$ sudo reboot

これで、Jetson TX1開発キットからHDMI→DVI-Dコネクタ経由でディスプレイ出力が出来ました。
# しかし、Raspberry PiもJetsonも、HDMI→DVI-Dコネクタ接続でDVI1は画面出力されるのに、DVI2が反応しないのです。SX2462Wの仕様なのか、DVI2の故障なのか。。

Skylake対応マザー(Z170-A)にUbuntu14.04をインストール

流行の低火力ディープラーニングを始めるため、約10年ぶりにPCを自組してセットアップ中です。

性能と静音性のトレードオフを取った結果、Core-i7 6700 + DDR4-2400 16GB×4 + ELSA GTX-1050Ti×2の構成としました。
6700はTDP65Wと低電力と高性能を両立する優秀なCPUです。
ELSA GTX-1050Tiは補助電源が不要かつ静音ファン搭載が特徴的です。SLI非対応ですがゲーム目的ではないため問題ありません。
マザーボードはPCI Express3.0で2x8構成が取れるASUS Z170-Aとしました。GPUを2枚同時に動作しても十分なバンド幅が確保できるのではないでしょうか。
2x16、4x8に対応するZ170-WSも気になりましたが、さすがに数%の性能向上で5万近いマザーは手が出ません。フルタワーでGPU4枚差しするなら良いかもしれませんが、もはや低火力ではないし、ECCメモリが使えないので業務用としても無理があるかなと。

さて、ここからが本題です。
Ubuntu14.04のインストールを試みましたが、かなりハマりました。

Ubuntu14.04はUEFIBIOSの2種類の起動方式に対応しており、インストール時に対応するモードを選択してLive-DVDを起動させます。
Z170-Aでは、UEFI BIOS Utility画面のBoot MenuにてUEFIと無印(BIOS)のどちらで起動するか選択します。

当初は他の古いディストロも混在したかったのでBIOSモードを試しましたが、一向にGUIが立ち上がりません。Live-DVDの起動もダメでした。
また、UEFIモードも直接インストールは同様にNGでした。
半分諦めつつも、Live-DVDを起動してからインストールを開始したら上手く行きました。

しかし、この時点でオンボードネットワークカードとサウンドカードが認識せず。
14.04は、LTS Enablement Stacksと呼ばれる最新ドライバを適用できる仕組みがありますが、ネットワーク接続が必要です。
手持ちのUSB-LAN変換コネクタ経由(Plantex社USB-LAN1000R)で接続し、インストールを継続しました。このコネクタはドライバ不要かつWin/Mac/Linux対応と非常に使い勝手が良いです。

起動後は、以下のコマンドを実行します。

sudo apt-get update
sudo apt-get upgrade
sudo apt-get dist-upgrade
sudo apt-get install --install-recommends linux-generic-lts-wily xserver-xorg-core-lts-wily xserver-xorg-lts-wily xserver-xorg-video-all-lts-wily xserver-xorg-input-all-lts-wily libwayland-egl1-mesa-lts-wil
sudo reboot

これでオンボードLANも認識されます。
さて、明日からはCUDAとJetsonTX1、Chainerの設定をしていきます。

OpenCV 2.4.13 と 3.1 を共存させる その2

前回からの続きです。

サンプルデザインでコンパイルできるか試してみます。
ここでは、HoGによる人検知を使ってみました。

適当に作業ディレクトリを掘り、サンプルファイルをコピーします。

mkdir ~/work_cv_test
cd ~/work_cv_test
cp ~/libs/opencv-2.4.13/samples/cpp/peopledetect.cpp .
cp ~/libs/opencv-2.4.13/samples/gpu/road.png .


以下の通りMakefileを作成します。

$ vim Makefile
CPP = g++

CFLAGS = -O0 -Wall
#CFLAGS = -O3 -Wall

CFLAGS = `pkg-config --cflags opencv`
LDFLAGS = `pkg-config --libs opencv`

TARGET = peopledetect
SRCS = peopledetect.cpp
OBJS = $(SRCS:.cpp=.o)

all: $(TARGET)

$(TARGET) : $(OBJS)
	$(CPP) -o $@ $< $(LDFLAGS) 2>&1 | c++filt

.cpp.o:
	$(CPP) -o $@ -c $< $(CFLAGS) 

clean:
	@rm -f *.o $(TARGET)


まず、2.4.13でコンパイル、実行します。

$ source setting-cv-2.4.13.sh
$ make
$ ./peopledetect road.png

以下のコマンドで、2.4.13のライブラリが使われていることが確認できます。

$ ldd peopledetect
  linux-vdso.so.1 =>  (0x00007fff11738000)
  libopencv_core.so.2.4 => ~/libs/opencv-2.4.13/release/installed/lib/libopencv_core.so.2.4 (0x00007f473d412000)
...

次に、3.1.0でコンパイルします。

$ make clean
$ source setting-cv-3.1.0.sh
$ make
$ ./peopledetect road.png

同様に、3.1.0のライブラリが使われていることが確認できます。

$ ldd peopledetect
  linux-vdso.so.1 =>  (0x00007fff2e3fe000)
  libopencv_objdetect.so.3.1 => ~/libs/opencv-3.1.0/release/installed/lib/libopencv_objdetect.so.3.1 (0x00007f6a5684d000)
...

なお、検出までの時間が出力されますが、手元の環境では、2.4.13で約880ms、3.1.0で約680msとなり、若干高速化されていることがわかります。

OpenCV 2.4.13 と 3.1 を共存させる

OpenCVの勉強のためにインストールしてみました。

Ubuntu14.04では公式リポジトリからapt-getにてOpenCV2.4.8をインストール可能ですが、2.x系と3.x系を混在させたかったのでソースからインストールします。

試した環境は以下の通りです。

OS等 :Ubuntu-14.04 64bit Desktop@WMWare
バージョン:2.4.13, 3.1
その他 :TBB有効、CUDA無効

基本的な手順はここの受け売りになります。


関連パッケージのインストール

$ sudo apt-get -y install build-essential cmake git libgtk2.0-dev pkg-config python-dev python-numpy libdc1394-22 libdc1394-22-dev libjpeg-dev libpng12-dev libtiff4-dev libjasper-dev libavcodec-dev libavformat-dev libswscale-dev libxine-dev libgstreamer0.10-dev libgstreamer-plugins-base0.10-dev libv4l-dev libtbb-dev libqt4-dev libfaac-dev libmp3lame-dev libopencore-amrnb-dev libopencore-amrwb-dev libtheora-dev libvorbis-dev libxvidcore-dev x264 v4l-utils unzip


OpenCVパッケージのアンインストール

$ sudo apt-get purge libopencv*

公式ページから2.4.133.1.0をダウンロード。


インストールディレクトリの作成。ここでは、ユーザのローカル(~/libs)に作成しています。

$ mkdir ~/libs


OpenCV 2.4.13のインストール。3.xむけのオプションも付加していますが、無視されます。

$ unzip opencv-2.4.13.zip
$ mv opencv-2.4.13 ~/libs/.
$ mkdir ~/libs/OpenCV2.4.13/release
$ cd ~/libs/OpenCV2.4.13/release
$ mkdir installed
$ cmake -D CMAKE_INSTALL_PREFIX=~/libs/opencv-2.4.13/release/installed -D CMAKE_BUILD_TYPE=RELEASE -D WITH_TBB=ON -D BUILD_NEW_PYTHON_SUPPORT=ON -D WITH_V4L=ON -D WITH_FFMPEG=OFF -D BUILD_opencv_python2=ON ..
$ make install


同様に3.1.0もインストールします。

# Install OpenCV 3.1.0
$ unzip opencv-3.1.0.zip
$ mv opencv-3.1.0 ~/libs/.
$ mkdir ~/libs/OpenCV3.1.0/release
$ cd ~/libs/OpenCV3.1.0/release
$ mkdir installed
$ cmake -D CMAKE_INSTALL_PREFIX=~/libs/opencv-3.1.0/release/installed -D CMAKE_BUILD_TYPE=RELEASE -D WITH_TBB=ON -D BUILD_NEW_PYTHON_SUPPORT=ON -D WITH_V4L=ON -D WITH_FFMPEG=OFF -D BUILD_opencv_python2=ON ..
$ make install

次にpkg-configを利用して、ライブラリのパス等を通します。設定ファイルはインストール先に作成されますが、多少変更が必要だったはずです。
作業したのが2週間前なので、変更箇所は忘れました。。


2.4.13のpkg-config設定ファイルです。

$ vim ~/libs/opencv-2.4.13/release/installed
# Package Information for pkg-config

prefix=~/libs/opencv-2.4.13/release/installed
exec_prefix=${prefix}
libdir=${exec_prefix}/lib
includedir_old=${prefix}/include/opencv
includedir_new=${prefix}/include

Name: OpenCV
Description: Open Source Computer Vision Library
Version: 2.4.13
Libs: -L${exec_prefix}/lib -lopencv_calib3d -lopencv_contrib -lopencv_core -lopencv_features2d -lopencv_flann -lopencv_gpu -lopencv_highgui -lopencv_imgproc -lopencv_legacy -lopencv_ml -lopencv_nonfree -lopencv_objdetect -lopencv_ocl -lopencv_photo -lopencv_stitching -lopencv_superres -lopencv_ts -lopencv_video -lopencv_videostab -ltbb -lrt -lpthread -lm -ldl
Cflags: -I${includedir_old} -I${includedir_new}


同様に、3.1.0のpkg-config設定ファイルです。

$ vim ~/libs/opencv-3.1.0/release/installed
# Package Information for pkg-config

prefix=~/libs/opencv-3.1.0/release/installed
exec_prefix=${prefix}
libdir=${exec_prefix}/lib
libdir3rd=${exec_prefix}/share/OpenCV/3rdparty/lib
includedir_old=${prefix}/include/opencv
includedir_new=${prefix}/include

Name: OpenCV
Description: Open Source Computer Vision Library
Version: 3.1.0
Libs: -L${exec_prefix}/lib -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
Libs.private: -L/usr/lib/x86_64-linux-gnu -lpng -lz -ltiff -ljasper -ljpeg -lImath -lIlmImf -lIex -lHalf -lIlmThread -lgtk-x11-2.0 -lgdk-x11-2.0 -latk-1.0 -lgio-2.0 -lpangoft2-1.0 -lpangocairo-1.0 -lgdk_pixbuf-2.0 -lcairo -lpango-1.0 -lfontconfig -lfreetype -lgstvideo-0.10 -lgstapp-0.10 -lgstbase-0.10 -lgstriff-0.10 -lgstpbutils-0.10 -lgstreamer-0.10 -lgobject-2.0 -lgmodule-2.0 -lgthread-2.0 -lxml2 -lglib-2.0 -ldc1394 -lv4l1 -lv4l2 -ldl -lm -lpthread -lrt -ltbb
Cflags: -I${includedir_old} -I${includedir_new}


コンパイル前にパスを通すための設定ファイルを作成します。2.4.13用の設定ファイルを以下の通りです。

$ vim setting-cv-2.4.13.sh
#! /bin/bash

CV_LIB_PATH=~/libs/opencv-2.4.13/release/installed/lib
export PKG_CONFIG_PATH=$CV_LIB_PATH/pkgconfig:$PKG_CONFIG_PATH
export LD_LIBRARY_PATH=$CV_LIB_PATH:$LD_LIBRARY_PATH


同様に3.1.0用の設定ファイルを作成します。

$ vim setting-cv-3.1.0.sh
#! /bin/bash

CV_LIB_PATH=~/libs/opencv-3.1.0/release/installed/lib
export PKG_CONFIG_PATH=$CV_LIB_PATH/pkgconfig:$PKG_CONFIG_PATH
export LD_LIBRARY_PATH=$CV_LIB_PATH:$LD_LIBRARY_PATH


次回は、サンプルデザインで実行してみます。