izumo’s diary

主に競プロの精進記録

Chainer 7.7.0 のインストールでハマった話

先日Chainer 7.7.0(+CuPy)のインストールしようとしてハマった際の記録です。結論から言うとCuPyのバージョンが新しすぎたのが原因でした。

環境

Ubuntu 20はChainerのドキュメントでは推奨環境になっていませんが、Chainerの開発者に聞いたところ問題ないとのことでした。

準備

GPUを使うために以下をインストールしました。探せば多くの記事が見つかるはずなので手順は省略します。

nvccで確認します。

$ nvcc -V
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2020 NVIDIA Corporation
Built on Thu_Jun_11_22:26:38_PDT_2020
Cuda compilation tools, release 11.0, V11.0.194

cudnn_samples_v8のmnistCUDNNで動作確認します。なおCUDAをデフォルトとは違うディレクトリに配置したのでMakefileのCUDA_PATHを適切に書き換えて実行しました。

$ make clean && make
︙
$ ./mnistCUDNN 
︙
Test passed!

CuPyとChainerのインストール

ChainerでGPUを使うためにはCuPyが必要です。CuPyのドキュメントを見ると

$ pip install cupy-cuda110

とCUDAのバージョンを指定する必要があることが分かります(このコマンドは間違っています)。

続いてChainer

$ pip install chainer

で最新版が入ります。

よし出来た!ということでChainerの実行環境を見てみます。

$ python -c 'import chainer; chainer.print_runtime_info()'
Platform: Linux-5.4.0-54-generic-x86_64-with-debian-bullseye-sid
Chainer: 7.7.0
ChainerX: Not Available
NumPy: 1.15.1
CuPy: Not Available
iDeep: Not Available

CuPy: Not Available←???
なぜかCuPyが使えないと言われてしまいました。

原因究明

最初はCUDAやcuDNNを疑いましたが、正常にインストールされているようでした。色々調べた結果、Chainerでcupy.utilがimportできていないことが分かりました。

CuPyのGithubを見ると_util.pyxというファイルがあります。しかしインストールしたCuPyにも_util.cpython-37m-x86_64-linux-gnu.soというそれらしきものが存在したので、なぜcupy.utilがimportできないのか、最初はさっぱり分かりませんでした。

分からん~と言いながら適当にCuPyのReleasesを眺めていたらv8.0.0のCode Fixesでこんなものがありました。

  • Rename cupy.util submodule to cupy._util (#3938)

ん?utilから_utilに変わっている!?なぜ気づけなかったorz

ファイル名が変わってChainerでcupy.utilをimportできないのが根本的な原因と分かりました。

解決

結局CuPyの最新版ではなく、8.0.0より前のものを入れればよいです。

まずは先ほど入れたCuPyとChainerをアンインストール。

$ pip uninstall chainer
$ pip uninstall cupy-cuda110

次にバージョンを指定してCuPyをインストール。

$ pip install 'cupy-cuda110>=7.7.0,<8.0.0'

最後にChainerをインストール。

$ pip install chainer

Chainerの実行環境を出力してみます。

$ python -c 'import chainer; chainer.print_runtime_info()'
Platform: Linux-5.4.0-54-generic-x86_64-with-debian-bullseye-sid
Chainer: 7.7.0
ChainerX: Not Available
NumPy: 1.15.1
CuPy:
  CuPy Version          : 7.8.0
  CUDA Root             : /.../cuda-11.0
  CUDA Build Version    : 11000
  CUDA Driver Version   : 11000
  CUDA Runtime Version  : 11000
  cuBLAS Version        : 11100
  cuFFT Version         : 10200
  cuRAND Version        : 10201
  cuSOLVER Version      : (10, 5, 0)
  cuSPARSE Version      : 11100
  NVRTC Version         : (11, 0)
  cuDNN Build Version   : 8002
  cuDNN Version         : 8005
  NCCL Build Version    : 2708
  NCCL Runtime Version  : 2708
  CUB Version           : Enabled
  cuTENSOR Version      : None
iDeep: Not Available

無事にGPUを使えるようになりました!