A certain engineer "COMPLEX"

開発メモ その163 Ubuntu 18.04 with CUDA 9.2でcaffeをビルドする

Introduction


Ubuntu 18.04でパッケージマネージャーからインストールできるgccのバージョンが7になっている。


$ gcc --version
gcc (Ubuntu 7.3.0-27ubuntu1~18.04) 7.3.0
Copyright (C) 2017 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

CUDA 9が6以降のgccでのビルドをサポートしていないため、caffeをビルドしようとするとエラーが起きてします。
が、openposeでビルドするときはこのエラーが起きないんですよね...
ちなみにこんなエラー。


$ cmake --build . --config Release
[ 1%] Running C++/Python protocol buffer compiler on /media/hdd/work/local/caffe/src/caffe/proto/caffe.proto
Scanning dependencies of target caffeproto
[ 1%] Building CXX object src/caffe/CMakeFiles/caffeproto.dir/__/__/include/caffe/proto/caffe.pb.cc.o
[ 1%] Linking CXX static library ../../lib/libcaffeproto.a
[ 1%] Built target caffeproto
[ 1%] Building NVCC (Device) object src/caffe/CMakeFiles/cuda_compile_1.dir/util/cuda_compile_1_generated_math_functions.cu.o
In file included from /usr/include/host_config.h:50:0,
from /usr/include/cuda_runtime.h:78,
from :0:
/usr/include/crt/host_config.h:121:2: error: #error -- unsupported GNU version! gcc versions later than 6 are not supported!
#error -- unsupported GNU version! gcc versions later than 6 are not supported!
^~~~~
CMake Error at cuda_compile_1_generated_math_functions.cu.o.Release.cmake:219 (message):
Error generating
/media/hdd/work/local/caffe/build/src/caffe/CMakeFiles/cuda_compile_1.dir/util/./cuda_compile_1_generated_math_functions.cu.o


src/caffe/CMakeFiles/caffe.dir/build.make:497: recipe for target 'src/caffe/CMakeFiles/cuda_compile_1.dir/util/cuda_compile_1_generated_math_functions.cu.o' failed
make[2]: *** [src/caffe/CMakeFiles/cuda_compile_1.dir/util/cuda_compile_1_generated_math_functions.cu.o] Error 1
CMakeFiles/Makefile2:235: recipe for target 'src/caffe/CMakeFiles/caffe.dir/all' failed
make[1]: *** [src/caffe/CMakeFiles/caffe.dir/all] Error 2
Makefile:129: recipe for target 'all' failed
make: *** [all] Error 2

とにかくこの対処方法。

How to


対処として、古いgccをインストールしてそっちに切り替える方法もありますが、面倒なのでこれはパス。
なので、CUDA側のgccバージョンチェックを無効化する方法を採用します。


$ sudo vi /usr/include/crt/host_config.h

で設定ファイルを開き、下記チェック個所をコメントアウトします。


#error -- unsupported GNU version! gcc versions later than 6 are not supported!
//#error -- unsupported GNU version! gcc versions later than 6 are not supported!

開発メモ その162 Ubuntu 18.04でVINOをコマンドラインから有効化する

Introduction


備忘録。
Ubuntu 16ならx11vnc一択なんですけど、Gnomeに変わったため、18ではこれができない。

How to


18からはネットワークに対してVinoの設定をON/OFFする仕組みに変わった模様。
Vinoインストール後、ネットワークマネージャーで接続一覧を表示、取得し、dconfで設定を有効化します。


$ sudo apt install vino
$ nmcli connection show
NAME UUID TYPE DEVICE
有線接続 1 ba688a1f-889f-30a0-b947-ed395181dc52 ethernet enp5s0
$ dconf write /org/gnome/settings-daemon/plugins/sharing/vino-server/enabled-connections "['ba688a1f-889f-30a0-b947-ed395181dc52']"
$ dconf read /org/gnome/settings-daemon/plugins/sharing/vino-server/enabled-connections
['ba688a1f-889f-30a0-b947-ed395181dc52']
$ ss -lnt | grep 5900
LISTEN 0 5 0.0.0.0:5900 0.0.0.0:*
LISTEN 0 5 [::]:5900 [::]:*

開発メモ その161 UbuntuでOpenPoseを動かす

Introduction


かなりはまったのでメモ。

How to


ビルドするだけなら簡単なのだが、動かすとどうしても動かない。
例えば下記のようなエラーが出る。


$ ./pose_1_extract_from_image.bin
Starting OpenPose demo...
F1219 20:52:30.150040 24594 upgrade_proto.cpp:97] Check failed: ReadProtoFromBinaryFile(param_file, param) Failed to parse NetParameter file: models/pose/body_25/pose_iter_584000.caffemodel
*** Check failure stack trace: ***
@ 0x7f91236e55cd google::LogMessage::Fail()
@ 0x7f91236e7433 google::LogMessage::SendToLog()
@ 0x7f91236e515b google::LogMessage::Flush()
@ 0x7f91236e7e1e google::LogMessageFatal::~LogMessageFatal()
@ 0x7f91230ac311 caffe::ReadNetParamsFromBinaryFileOrDie()
@ 0x7f912322351a caffe::Net<>::CopyTrainedLayersFromBinaryProto()
@ 0x7f912501ae17 op::NetCaffe::initializationOnThread()
@ 0x7f912503b48e op::addCaffeNetOnThread()
@ 0x7f912503bf7a op::PoseExtractorCaffe::netInitializationOnThread()
@ 0x7f9125040b80 op::PoseExtractorNet::initializationOnThread()
@ 0x404320 tutorialDeveloperPose1()
@ 0x403613 main
@ 0x7f9123f52830 __libc_start_main
@ 0x403649 _start
@ (nil) (unknown)
Aborted (core dumped)

この現象はissueとして登録されている。

Executed Command (if any) cd /path/to/openpose/build/examples/openpose/ ./openpose.bin --face --logging_level 0 OpenPose Output (if any) /path/to/openpose/in...

ただし、一部のUbuntuで発生しているようで、作者の環境では再現できていない模様。
解決策は、

  • OpenPoseに含まれているCaffeを使わずシステムに登録されているCaffeを使う
  • OpenPoseに含まれているCaffeのリビジョンを変更する

となる。

後者の解決策は

Executed Command (if any) cd /path/to/openpose/build/examples/openpose/ ./openpose.bin --face --logging_level 0 OpenPose Output (if any) /path/to/openpose/in...

で提示されていた。

まず


$ vi openpose/CMakeLists.txt

でファイルを開く。次に、caffeのソースを取得する箇所を修正する。
具体的な行数はリビジョンによって変わるため、下記の行番号は参考であるが、下記の記述はソース中に2つあるため、探せば必ず見つかる。


# Build Process
set(CAFFE_CPU_ONLY OFF)
if (${GPU_MODE} MATCHES "CUDA")
- execute_process(COMMAND git checkout master WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/3rdparty/caffe)
+ execute_process(COMMAND git checkout f019d0dfe86f49d1140961f8c7dec22130c83154 WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/3rdparty/caffe)
elseif (${GPU_MODE} MATCHES "CPU_ONLY")
if (USE_MKL)
#execute_process(COMMAND git checkout intel WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/3rdparty/caffe)
@@ -682,7 +682,7 @@ if (UNIX OR APPLE)
"${CMAKE_BINARY_DIR}/caffe/lib/libmkldnn.so"
)
else (USE_MKL)
- execute_process(COMMAND git checkout master WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/3rdparty/caffe)
+ execute_process(COMMAND git checkout f019d0dfe86f49d1140961f8c7dec22130c83154 WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/3rdparty/caffe)
endif (USE_MKL)
set(CAFFE_CPU_ONLY ON)
set(USE_CUDNN OFF)

この修正を完了後、


$ sudo apt install -y cmake libopencv-dev
$ sudo apt install -y libgflags-dev libgoogle-glog-dev libprotobuf-dev protobuf-compiler libhdf5-serial-dev
$ sudo apt install -y libatlas-base-dev
$ sudo apt install -y --no-install-recommends libboost-all-dev
$ mkdir build
$ cd build
$ cmake ..
$ cmake --build . --config Release

でビルドが可能になる。

また、利用するCUDAは9.2未満にすること。
これは、caffeがlibcublas_device.aを参照しているが、CUDA 9.2で削除されてためである。

開発メモ その160 Ubuntu 18にCUDA 10とcuDNNをインストール

Introduction


Windowsみたいにインストーラがないのでメモ。ちなみにMacはインストーラがある。

How to



> wget https://developer.nvidia.com/compute/cuda/10.0/Prod/local_installers/cuda-repo-ubuntu1804-10-0-local-10.0.130-410.48_1.0-1_amd64
> sudo dpkg -i cuda-repo-ubuntu1804-10-0-local-10.0.130-410.48_1.0-1_amd64.deb
(データベースを読み込んでいます ... 現在 218372 個のファイルとディレクトリがインストールされています。)
cuda-repo-ubuntu1804-10-0-local-10.0.130-410.48_1.0-1_amd64.deb を展開する準備をしています ...
cuda-repo-ubuntu1804-10-0-local-10.0.130-410.48 (1.0-1) を展開しています...

cuda-repo-ubuntu1804-10-0-local-10.0.130-410.48 (1.0-1) を設定しています ...

The public CUDA GPG key does not appear to be installed.
To install the key, run this command:
sudo apt-key add /var/cuda-repo-10-0-local-10.0.130-410.48/7fa2af80.pub
> sudo apt-key add /var/cuda-repo-10-0-local-10.0.130-410.48/7fa2af80.pub
OK
> sudo apt-get update
> sudo apt-get install cuda-10-0

終わったら再起動が必須です。

続いてcuDNN。


sudo dpkg -i libcudnn7_7.4.1.5-1+cuda10.0_amd64.deb
sudo dpkg -i libcudnn7-dev_7.4.1.5-1+cuda10.0_amd64.deb
sudo dpkg -i libcudnn7-doc_7.4.1.5-1+cuda10.0_amd64.deb

開発メモ その159 ChainerCVでSSDのメモ

Introduction


備忘録。基本中の基本だけど数学苦手で理論も苦手な自分用のメモ。
基本、train.pyについての解説。

What is problem?


配列の次元の意味

ChainerCVにおけるサンプルのSSDの実装は、MultiboxTrainChainクラスが中心。
で、ネットワークに画像(正確にはバッチ数分)を入力した際の出力について。

下記画像における、mb_locsmb_confs

  • mb_locs
    • multibox locations、つまり位置の損失
    • 次元は、バッチ数、8732、4(x,y,w,h)
  • mb_confs
    • multibox confidences、つまり確信度の損失
    • 次元は、バッチ数、8732、カテゴリ数+1

となる。
カテゴリ数にプラス1しているのは、どのカテゴリにも合致しない、というカテゴリを用意するため。
SSDのサンプルはVOC2007のため、カテゴリ数は20なので、21になる。
8732はデフォルトボックス、つまり画像全体を分割する矩形の個数。

なので、mb_confsの場合、カテゴリ毎に8732の矩形それぞれに損失が格納されていることを意味する。
(正確には、画像毎に対して、カテゴリ8732個が割り当てられ、その1つ1つにカテゴリ21個の損失が格納されている。)
損失はラベルに合致した場合は正、合致しない場合は負になる。

可視化

学習や推論に使用される変数を可視化するといろいろわかる。

データセット

学習を始める前に、利用される教師データがどのようなものかを可視化する。


from chainercv.visualizations import vis_bbox

vocTrain = VOCBboxDataset(year='2007', split='trainval')
img, bbox, label = vocTrain[0]
vis_bbox(img, bbox, label)

imgs

MultiboxTrainChaincallに渡ってくる引数を確認することでいろいろな情報が確認できる。
imgs

  1. cupy.core.core.ndarrayなので、Numpy.ndarrayに変換
  2. チャネル数、高さ、幅の順の次元をNumpy.transposeで、高さ、幅、チャネル数に変換
  3. uint8に変換
  4. RGB形式として画像に変換し、ファイル出力

という手順で可視化ができる。


from PIL import Image
Image.fromarray(np.uint8(np.transpose(chainer.cuda.to_cpu(imgs[0]), (1, 2, 0))),"RGB").save("test.png")

この段階で来る画像は、学習用に水増しされている画像に変換されているので注意。