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をインストールします。
NVIDIAのHPから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 12月 10 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 12月 10 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はUEFIとBIOSの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*
インストールディレクトリの作成。ここでは、ユーザのローカル(~/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
次回は、サンプルデザインで実行してみます。