Chainerアップデート(ver1系→2)にはまったCuPyインストール編…sudoの甘い(嘘)罠…


はじめに

画像分類などや動画解析でDeep Learningを良く使います。
試してみたい姿勢判定用のデモがCUDA8以上にしか対応してしていなかったようなので、渋々Cudaのアップデートを敢行。CUDAを入れ替える関係でパッケージもついでにアップデートしてしまえ!!と言うのが今回はまった罠でした。
この記事ではver1から(正確には1.23)ver2へのアップデートを行った際にハマったポイントを紹介します。

環境について

試した環境は以下の通りです。
Ubuntu14.04
CUDA8
cuDNN6
Python 2.7.12
ちなみにGPUはNVIDIA TITANX

Chainerについて

数あるフレームワークから選んだのはなぜか?
和製フレームワークと言う事もあり。Deep Learningを勉強するにはいいかなと思ってたのが一つ。ネットワーク構造の書き方が(Caffeと比べ)シンプルで見やすく感じたのが選択した理由でした。
更新も早いしね。(それが良いかどうかは置いといて)

Chainer ver2について

バージョンについて

表記がver1と比べ変わったのが一番大きい。これまでにも古いバージョンでは動いた(通った)コードがバージョンアップに伴いエラーとして扱われるようになったというのはありましたが…今回はかなり大規模に変わった印象です。
色々変わった所については別な記事やリリースノートにお任せするとして…環境整備に関連する一番大きな変更はCuPyのインストールでしょうか。
CuPyはChainerに含まれているライブラリの一つでNumpyとの互換を強く意識しています。これがないと、行列計算を効率よく(Chainer上で)出来ません。
このCuPyのインストールですが、今まではChainerをインストールするタイミングで入ってましたが、ver2.0からは別にインストールすることになりました。(←重要ポイント)

CudaおよびcuDNNのアップデート

下記記事を参照させていただきました。
http://qiita.com/JeJeNeNo/items/05e148a325192004e2cd
この記事と違うところはUbuntuのバージョンとcuDNNのバージョンですが、基本やることは同じ。
あと、悪名高きディスプレイドライバー。普段はTeratermから作業しているので問題はありませんが、GUI側でログインできない(いわゆるログインループ)現象が発生するかもしれません。私の場合は以下のコマンドを実行して治りました。

sudo add-apt-repository ppa:xorg-edgers/ppa
sudo apt-get update
sudo apt-get upgrade
//ドライバーのリストをチェック
sudo apt-cache search 'nvidia-[0-9]+$'
//最新のものをインストール
sudo apt-get install nvidia-381

SSHでやったような気もするけどだめなら
sudo service lightdm stop
でデスクトップマネージャーを停止する必要がある。

Chainerアップデート

アップデートは基本的に楽なはず。
sudo pip install -U chainer
出来たら確認。

xxxx@xxxx:~$ python
Python 2.7.12 (default, Jul 18 2016, 15:02:52)
[GCC 4.8.4] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import chainer as ch
>>> ch.__version__
'2.0.0'
>>> ch.cuda.available
False
>>> ch.cuda.cudnn_enabled
False

Chainerが正しくCUDAを認識していないようだ…。
この時点でCuPyがインストールされていないことに気付く。
って事で入れてみた

sudo pip install -U cupy
(中略)
    **************************************************
    *** WARNING: nvcc not in path.
    *** WARNING: Please set path to nvcc.
    **************************************************
(略)

nvccがインストールされていない??エラーはたくさん出たけどそもそもコンパイラーであるnvccが認識できていない時点でダメ…確認。

$ which nvcc
/usr/local/cuda/bin/nvcc

…あれ、認識できている。
色々試行錯誤してた時にふと、CuPyのインストールガイド(https://docs-cupy.chainer.org/en/stable/install.html )を見るとこんな記述が

sudoを使うとパス情報が上手く読み込めないって話あったっけ…。
記載通りにやってみましょうか。

$ sudo CUDA_PATH=/usr/local/cuda/ CFLAGS=-I$CUDA_PATH/include PATH=/usr/local/cuda/bin LD_LIBRARY_PATH=/usr/local/cuda/lib64 pip install cup
y --no-cache
(中略)
    **************************************************
    *** WARNING: nvcc path != CUDA_PATH
    *** WARNING: nvcc path: /usr/local/cuda
    *** WARNING: CUDA_PATH: /usr/local/cuda/
    **************************************************
    Include directories: ['/usr/local/cuda/include']
    Library directories: ['/usr/local/cuda/lib64']
    command 'x86_64-linux-gnu-gcc' failed with exit status 1
    **************************************************
    *** WARNING: Include files not found: ['cublas_v2.h', 'cuda.h', 'cuda_profiler_api.h', 'cuda_runtime.h', 'curand.h', 'nvToolsExt.h']
    *** WARNING: Skip installing cuda support
    *** WARNING: Check your CFLAGS environment variable
    **************************************************
(略)

エラーメッセージが変わった…。けどうまくいかない…。
ここまでの作業sudoでやろうとしていたのがそもそもの…間違いかも…と言う事でrootユーザーになって実行することに。

$ su -
(略)
export CUDA_PATH=/usr/local/cuda/
export CFLAGS=-I$CUDA_PATH/include 
export PATH=/usr/local/cuda/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/cuda/lib64:$LD_LIBRARY_PATH
pip2 install cupy --no-cache-dir

(中略)
Successfully installed cupy-1.0.0.1

うまくいった!!
(2017.10.1追記)6in様からご指摘がありまして、PATHおよびLD_LIBRARY_PATH変数のexport時に自身の変数を読み込む設定を追記させていただきました。ご指摘ありがとうございました

確認

で、確認

$ python
Python 2.7.12 (default, Jul 18 2016, 15:02:52)
[GCC 4.8.4] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import chainer as ch
>>> ch.__version__
'2.0.0'
>>> ch.cuda.available
True
>>> ch.cuda.cudnn_enabled
True
>>>

うまく認識されることを確認しました。

まとめ

結局アップデートはsudoでやるのは危険という話もあるかもしれません。root使えない環境だとどうやったらうまくいったのでしょ。…前のバージョンではうまく(以下略)

上記流れはもろもろの試行錯誤をそぎ落としています…。
マニュアル通りのコマンドを打ってうまくいかなかったり。
Cudaのインストールをやり直してみたり。
ソースコードからCupyのインストールもやってみたり。Chainerのバージョンを下げてみたり。(1系だとエラーも出ずに普通に行く)

そもそも楽しようと思って選ぶフレームワークでここまで悩まされるとは思いもよらなかった…(はまったポイントが基礎的な部分というお叱りもあるかとは思うのですが)
実は並行してChainerCVも試してみたのですがこちらもバージョンアップでの弊害が…。
勘弁してください。
記事はそのうち記載します。
参考になると嬉しいです。