Azure VMにCaffeを躓きながら入れた話
2019-07-19
はじめに
オープンソースの学習済みモデルを動かすためにCaffeをインストールしようとしたら、結構躓いたので、躓きポイントとその対処を紹介します。
ちなみに、学習しないのでGPUは載ってない環境です。
環境
- Azure VM(Standard B2s (2 vcpu 数、4 GiB メモリ))
- Linux (ubuntu 18.04)
- Python3.6
躓きポイント make編
このページを参考にインストールしていたのですが、以下のコマンドでエラーを連発してました。
make all -j4
やっぱり、makeは鬼門・・・。
それでは、1つずつどうぞ。
fatal error: boost
エラー文は以下。
$ make all -j4
CXX src/caffe/solver.cpp
CXX src/caffe/internal_thread.cpp
CXX src/caffe/layer_factory.cpp
CXX src/caffe/common.cpp
src/caffe/internal_thread.cpp:1:10: fatal error: boost/thread.hpp: No such file or directory
#include <boost/thread.hpp>
^~~~~~~~~~~~~~~~~~
compilation terminated.
Makefile:591: recipe for target '.build_release/src/caffe/internal_thread.o' failed
make: *** [.build_release/src/caffe/internal_thread.o] Error 1
make: *** Waiting for unfinished jobs....
src/caffe/common.cpp:1:10: fatal error: boost/thread.hpp: No such file or directory
#include <boost/thread.hpp>
^~~~~~~~~~~~~~~~~~
compilation terminated.
Makefile:591: recipe for target '.build_release/src/caffe/common.o' failed
make: *** [.build_release/src/caffe/common.o] Error 1
src/caffe/solver.cpp:6:10: fatal error: boost/algorithm/string.hpp: No such file or directory
#include "boost/algorithm/string.hpp"
^~~~~~~~~~~~~~~~~~~~~~~~~~~~
compilation terminated.
Makefile:591: recipe for target '.build_release/src/caffe/solver.o' failed
make: *** [.build_release/src/caffe/solver.o] Error 1
In file included from ./include/caffe/blob.hpp:8:0,
from ./include/caffe/layer.hpp:8,
from src/caffe/layer_factory.cpp:8:
./include/caffe/common.hpp:4:10: fatal error: boost/shared_ptr.hpp: No such file or directory
#include <boost/shared_ptr.hpp>
^~~~~~~~~~~~~~~~~~~~~~
compilation terminated.
Makefile:591: recipe for target '.build_release/src/caffe/layer_factory.o' failed
make: *** [.build_release/src/caffe/layer_factory.o] Error 1
要はboostがないというエラーなのですが、上の手順でインストールしたはず・・・。
そんな時はこのコマンドをどうぞ。
sudo apt-get install libboost-dev
Makefile:582: failed
Makefile:582でのエラー文は以下です。
$ make all -j4
CXX src/caffe/solver.cpp
CXX src/caffe/layer_factory.cpp
CXX src/caffe/internal_thread.cpp
・・・
CXX examples/siamese/convert_mnist_siamese_data.cpp
AR -o .build_release/lib/libcaffe.a
LD -o .build_release/lib/libcaffe.so.1.0.0
/usr/bin/ld: cannot find -lboost_system
/usr/bin/ld: cannot find -lboost_filesystem
/usr/bin/ld: cannot find -lboost_thread
collect2: error: ld returned 1 exit status
Makefile:582: recipe for target '.build_release/lib/libcaffe.so.1.0.0' failed
make: *** [.build_release/lib/libcaffe.so.1.0.0] Error 1
make: *** Waiting for unfinished jobs....
そんな時は以下のコマンド。
sudo apt-get install libboost-system-dev
Makefile:635: failed
エラー文は以下です。
imreadがないぞと怒られるエラー。
$ make all -j4
・・・
CXX/LD -o .build_release/tools/upgrade_net_proto_text.bin
.build_release/lib/libcaffe.so: undefined reference to `cv::imread(cv::String const&, int)'
.build_release/lib/libcaffe.so: undefined reference to `cv::String::allocate(unsigned long)'
.build_release/lib/libcaffe.so: undefined reference to `cv::String::deallocate()'
.build_release/lib/libcaffe.so: undefined reference to `cv::imencode(cv::String const&, cv::_InputArray const&, std::vector<unsigned char, std::allocator<unsigned char> >&, std::vector<int, std::allocator<int> > const&)'
collect2: error: ld returned 1 exit status
Makefile:635: recipe for target '.build_release/tools/compute_image_mean.bin' failed
make: *** [.build_release/tools/compute_image_mean.bin] Error 1
make: *** Waiting for unfinished jobs....
.build_release/lib/libcaffe.so: undefined reference to `cv::imread(cv::String const&, int)'
.build_release/lib/libcaffe.so: undefined reference to `cv::String::allocate(unsigned long)'
.build_release/lib/libcaffe.so: undefined reference to `cv::String::deallocate()'
.build_release/lib/libcaffe.so: undefined reference to `cv::imencode(cv::String const&, cv::_InputArray const&, std::vector<unsigned char, std::allocator<unsigned char> >&, std::vector<int, std::allocator<int> > const&)'
collect2: error: ld returned 1 exit status
Makefile:635: recipe for target '.build_release/tools/upgrade_net_proto_text.bin' failed
make: *** [.build_release/tools/upgrade_net_proto_text.bin] Error 1
.build_release/lib/libcaffe.so: undefined reference to `cv::imread(cv::String const&, int)'
.build_release/lib/libcaffe.so: undefined reference to `cv::String::allocate(unsigned long)'
.build_release/lib/libcaffe.so: undefined reference to `cv::String::deallocate()'
.build_release/lib/libcaffe.so: undefined reference to `cv::imencode(cv::String const&, cv::_InputArray const&, std::vector<unsigned char, std::allocator<unsigned char> >&, std::vector<int, std::allocator<int> > const&)'
collect2: error: ld returned 1 exit status
Makefile:635: recipe for target '.build_release/tools/extract_features.bin' failed
make: *** [.build_release/tools/extract_features.bin] Error 1
これはMakefile.configを以下を追加したら行けました。
USE_OPENCV := 0
これで一通りはmakeできました。
躓きポイント import caffe編
いよいよ、import caffeして使うぞという場面でもこけにこけまくりました。
No module named 'caffe._caffe'
いや、caffeさっき入れたじゃんと言いたくなるようなエラー。エラー文全文は以下。
>>> import caffe
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/home/dluser/caffe/python/caffe/__init__.py", line 1, in <module>
from .pycaffe import Net, SGDSolver, NesterovSolver, AdaGradSolver, RMSPropSolver, AdaDeltaSolver, AdamSolver, NCCL, Timer
File "/home/dluser/caffe/python/caffe/pycaffe.py", line 13, in <module>
from ._caffe import Net, SGDSolver, NesterovSolver, AdaGradSolver, \
ModuleNotFoundError: No module named 'caffe._caffe'
これには以下のコマンドを実行しましょう。
make distribute
ImportError: cannot import name '_validate_lengths'
エラー全文は以下。
>>> import caffe
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/home/dluser/caffe/python/caffe/__init__.py", line 1, in <module>
from .pycaffe import Net, SGDSolver, NesterovSolver, AdaGradSolver, RMSPropSolver, AdaDeltaSolver, AdamSolver, NCCL, Timer
File "/home/dluser/caffe/python/caffe/pycaffe.py", line 15, in <module>
import caffe.io
File "/home/dluser/caffe/python/caffe/io.py", line 2, in <module>
import skimage.io
File "/usr/lib/python3/dist-packages/skimage/__init__.py", line 158, in <module>
from .util.dtype import *
File "/usr/lib/python3/dist-packages/skimage/util/__init__.py", line 7, in <module>
from .arraycrop import crop
File "/usr/lib/python3/dist-packages/skimage/util/arraycrop.py", line 8, in <module>
from numpy.lib.arraypad import _validate_lengths
ImportError: cannot import name '_validate_lengths'
調べてみると、scikit-imageのバージョンが古いせいらしいです。
そのため、以下のコマンドでアップデート。
pip3 install -U scikit-image
以上で躓きは解消されて、無事インポートできました。
おわりに
びっくりするくらい躓きまくりました。
機械学習自体は楽しいのですが、環境構築がつらいです。