Azure VMにCaffeを躓きながら入れた話
2019-07-19
azblob://2022/11/11/eyecatch/2019-07-19-caffe-install-into-azure-vm-000.jpg

はじめに

オープンソースの学習済みモデルを動かすために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

以上で躓きは解消されて、無事インポートできました。

おわりに

びっくりするくらい躓きまくりました。
機械学習自体は楽しいのですが、環境構築がつらいです。