Python3でCaffeの環境構築をやってみた

技術研究所のYKです。 今回、新たにGPU環境を構築する必要が生じたので、そのついでにPython3でのCaffe環境構築を試してみました。 以前もCaffeの環境構築を行いましたが、その時には、情報がより多く出回っているという理由からPython2.7を使用して環境構築を行いました。
しかし、普段の業務やプライベートではPython3系を使っている為、どうせならPython3系を使ってやってみよう!と思い立ったのがキッカケです。 Python2.7での環境構築では手間取らなかったようなところで手間取ったので、(私自身の備忘の為にも)試行錯誤した結果をメモしておきます。

下準備

  • 環境: AWS EC2上にGPUインスタンスを立てました。
    • インスタンスタイプ: g2.8xlarge
      • これまではg2.2xlargeのインスタンスを使っていましたが、今回はかなりスペックを上げてみました。 下記表は、 https://aws.amazon.com/jp/ec2/instance-types/ より引用しています。
        モデル GPU vCPU メモリ(GiB) SSDストレージ (GB)
        g2.2xlarge 1 8 15 1 x 60
        g2.8xlarge 4 32 60 2 x 120
    • OS: Ubuntu 16.04.2 LTS
    • アーキテクチャ: 64bit(x86_64)

     

  • 導入したライブラリ
    • CUDA 8.0
    • cuDNN 5.1
    • Python
      • 今後TensorFlowやChainer等を導入することが見込まれる為、pyenvを利用してAnacondaの導入を行いました。
      • Anacondaのバージョン: Python 3.6.0 :: Anaconda 4.3.1
      • pyenv
        • Pythonのバージョン管理システム 複数のバージョンのPythonを共存させたり、用途に応じて利用するPythonのバージョンを切替えたりできる
          pyenv GitHub
      • Anaconda
        • Continuum Analyticsが提供している、Pythonと科学計算向けのライブラリが同梱されたPythonのパッケージ
          Linux版、macOS版、Windows版が提供されており、それぞれPython2.7、Python3.6向けが提供されている

環境構築で手間取ったところ

手間取った箇所のログと、その対策を記載しておきます。

Caffeのmake時に出たエラー

1. pyconfig.h: No such file or directory

  • 原因
    • 導入したAnacondaのパスをMakefile.configに設定していなかったことに因ります。
  • 対策
    • Makefile.configを以下のように修正しました。

2. libcaffe.so, not found

  • 原因
    • Makefile.config内のANACONDA_INCLUDEに、libcaffe.soが格納されているディレクトリのパスが記載されていなかったことに因ります。
  • 対策
    • Makefile.configを以下のように修正しました。

  ここまでで、一旦make all -> make test -> make runtest -> make pycaffeが全て通るようになりました。


import caffe時に出たエラー

makeが全て通ったのでPythonインタプリタ上で import caffe を叩いてみましたが、まだまだエラーが出ました。

1. gccランタイムライブラリのバージョンミスマッチ

  • 原因
    • libstdc++に含まれるGLIBCのバージョンが適切でないことによるエラーであり、 $HOME/.pyenv/versions/anaconda3-4.3.1/bin/../lib/libstdc++.so.6に、GLIBCXX_3.4.21が含まれていないことに起因するものでした。
    • ※ 合致するバージョンを含むlibstdc++やlibgompが見つからなかった場合はcondaコマンド等を利用して更新する必要がありますが、今回は割愛致します。
  • 対策
    • 以下の手順で対策を行いました。
      (1) libstdc++.so.6に含まれるGLIBCのバージョンを確認する

      • ちなみに、上記のlibstdc++.so.6はシンボリックリンクであり、実体は同一ディレクトリ内のlibstdc++.so.6.0.19であることが分かりました。 なので、次はlibstdc++.so.6.0.19よりも新しいバージョンのlibstdc++がないか探してみます。
         
      (2) libstdc++が付くファイルを検索する

       

      (3) 見つけたlibstdc++に含まれるGLIBCのバージョン確認
      • (1) と同様の手順で、内包しているランタイムのバージョンを確認します。
      • 見つけたlibstdc++がシンボリックリンクか否か確認します。

       

      (4) シンボリックリンクを張り直す
      • 念の為、元のlibstdc++.so.*をバックアップした上で行いました。

       

      (5) import caffeしてみる
      • 再度Pythonインタプリタを起動し、import caffeを実行してみました。
        • 当方の環境では、今度はlibgomp.so.1が存在しないというエラーが出ましたが、 (1) ~ (4)の対象をlibgomp.so.1に読み替えて対応し、解消しました。

 

2. boost.pythonに起因するエラー

  • 原因
  • 対策
    • 以下の手順で対策を行いました。
    • (1) Python3向けのboost.pythonを有効化
      • Makefile.config内の以下の部分で、boost.python等のバージョン指定を行っている為、 当該行のコメントアウトを外します。

      (2) インストール済のlibboost.python, libpythonの検索とバージョンの確認

      上記の出力から、libpython3.5とlibboost_python-py35.soが存在することが確認できます。

      • 対策: Makefile.configの修正
        • PYTHON_LIBRARIESにてライブラリの名称が指定されており、また、PYTHON_LIBRARIESはLIBRARY_DIRSを参照していると考えられる為、LIBRARY_DIRSに対して両ファイルが格納されているディレクトリのパス(/usr/lib/x86_64-linux-gnu)を追加しました。

      • ※ Makefile.configの修正箇所を極力少なくする為にlibpython3.5m.soを利用しましたが、libpython3.6m.soを利用した方が良いかもしれません。
      (3) シンボリックリンクを張る

3. dateutilに起因するSyntaxError

  • 原因
    • Anacondaに含まれるmatplotlibライブラリに起因する問題
      • Caffeがmatplotlibに依存しており、また、そのmatplotlibがimportしているdateutilのバージョンが古い為に発生していると見られます。
    • 参考
  • 対策
    • 下記の通り、dateutilを更新することで解消しました。

その他雑記

  • makeを叩く際には以下のように呼び出すのがおすすめです。

まとめ

  • 細かなところで手こずりましたが、何とかPython3.6からCaffeを呼び出せるようになりました。 g2.2xlargeインスタンスと比べ、どれほど学習が速くなるかを検証してみようと思います。
  • このエントリーをはてなブックマークに追加