プログラミング:caffe2とgcc7.3をWSLにインストールする

caff2をWSL(Windows Subsystem for Linux)にインストールしようとすると、自分の環境では、UbuntuデフォのCコンパイラー、gcc/g++-5.41ではコンパイルできない。なので、最新のバージョンをインストールする必要があった。現在最新のg++7.3をインストールにはソースからビルドするのでかなり時間がかかる。手持ちの旧式のパソコンでだいたい丸一日かかった。J4でやるとビルド中にフリーズするので、J2を指定、それでもビルド以外の作業は何もできなくなり、つくづく、パソコンの買い時であることを痛感させられた。

g++7.3のインストール手順はこのサイトを参考にさせてもらった。

1
2
3
4
5
cd ~
wget http://gcc.parentingamerica.com/releases/gcc-7.3.0/gcc-7.3.0.tar.gz
tar -xvzf gcc-7.3.0.tar.bz2
cd gcc-7.3.0
contrib/download_prerequisites

WSLのデフォルトになっているgcc5.41に依存しているパッケージもあるので、今回新たに付け加えるコンパイラのgcc7.3は/usr/local/gcc-7.3フォルダにインストールする。

1
2
3
cd ~
mkdir build && cd build
../gcc-7.3.0/configure -v --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu --prefix=/usr/local/gcc-7.3 --enable-checking=release --enable-languages=c,c++,fortran --disable-multilib --program-suffix=-7.3

コンパイル作業を高速化するために、コア数×2(スレッド数)の値を-jオプションに付け加える。マシン性能が著しく低い場合、例えば、デュアルコアの場合、-j 2ぐらいにしておいた方がマシンに優しい。

1
make -j 8

最後に、システムパスを加える場合、以下のコマンドを入力して、インストール作業終了。

1
2
3
echo 'export PATH=/usr/local/gcc-7.1/bin:$PATH' >> .bashrc
echo 'export LD_LIBRARY_PATH=/usr/local/gcc-7.1/lib64:$LD_LIBRARY_PATH' >> .bashrc
source .bashrc

今度はこの新しいgccを使ってcaffe2をビルドする。caffe2はAnacondaを介してinstallするのがおすすめだとこのサイトに書いてあったのでそうした。

1
2
3
cd ~
git clone --recursive https://github.com/caffe2/caffe2.git && cd caffe2/conda/no_cuda/
nano build.sh

build.shを開いたら、以下の2行をCMAKE_ARGS+=の項目にappend。

1
2
CMAKE_ARGS+=("-DCMAKE_C_COMPILER=/usr/local/gcc-7.3/bin/x86_64-linux-gnu-gcc-7.3")
CMAKE_ARGS+=("-DCMAKE_CXX_COMPILER=/usr/local/gcc-7.3/bin/x86_64-linux-gnu-g++-7.3")

ctrl+xyenterでファイルをsaveしてnanoを終了。

1
2
cd ../..
CONDA_INSTALL_LOCALLY=1 ./scripts/build_anaconda.sh

ビルドにはかなり時間がかかる。caffe2インストによりtensorflowやnumpyがdowngradeされる。

jupyter notebookを開いて下記のコードをコピペして実行。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
from __future__ import absolute_import
from __future__ import division
from __future__ import print_function
from __future__ import unicode_literals

# We'll also import a few standard python libraries
from matplotlib import pyplot
import numpy as np
import time

# These are the droids you are looking for.
from caffe2.python import core, workspace
from caffe2.proto import caffe2_pb2

# Let's show all plots inline.
%matplotlib inline

下記のようなアウトプットが出ればインストールは無事終了。

WARNING:root:This caffe2 python run does not have GPU support. Will run in CPU only mode.
WARNING:root:Debug message: No module named 'caffe2.python.caffe2_pybind11_state_gpu'

念のために下記のコードを貼り付けて実行。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
from __future__ import absolute_import
from __future__ import division
from __future__ import print_function
from __future__ import unicode_literals
%matplotlib inline
from matplotlib import pyplot
import numpy as np
import os
import shutil
import operator
import caffe2.python.predictor.predictor_exporter as pe

from caffe2.python import (
brew,
core,
model_helper,
net_drawer,
optimizer,
visualize,
workspace,
)

# If you would like to see some really detailed initializations,
# you can change --caffe2_log_level=0 to --caffe2_log_level=-1
core.GlobalInit(['caffe2', '--caffe2_log_level=0'])
print("Necessities imported!")

# If True, use the LeNet CNN model
# If False, a multilayer perceptron model is used
USE_LENET_MODEL = True

以下のようなアウトプットが出ればインストは無事完了。

WARNING:root:This caffe2 python run does not have GPU support. Will run in CPU only mode.
WARNING:root:Debug message: No module named 'caffe2.python.caffe2_pybind11_state_gpu'

Necessities imported!

もし、下記のようなエラーメッセージが吐き出された場合、

ImportError: libopencv_ccalib.so.3.1: cannot enable executable stack as shared object requires

このサイトに以下のように対処すると良いと書いてあった。

1
2
3
sudo apt-get install execstack
sudo execstack -c $home.pyenv/versions/anaconda3-5.1.0/envs/py36/lib/libopencv_*
sudo apt-get install gtk2.0-0

※ライブラリパスは、自分の環境に合わせて変える必要がある。

スポンサーリンク