環境
Ubuntu 20.04.1 LTS
GeForce RTX 2070 SUPER
Nvidia ドライバ 455.38
CUDA Version 10.1.243
python 3.7.3
anaconda-navigator 2.0.3
VS code 1.57.1
anaconda上で仮想環境を作り、その中でVS codeを使っています。
背景
受講中の講座の課題提出において、Kerasなどのライブラリを使わずにnumpy中心で画像認識のディープラーニングモデルを構築する必要がありました。データ水増する予定でしたがCPUのみでは時間がかかりすぎるので、cupyをインストールしてGPUによる高速化を図ることにしました。
デバッグ中、だいたい同じところで下記を含む謎のエラーが大量に出て止まりました。
cupy_backends.cuda.api.runtime.CUDARuntimeError: cudaErrorIllegalAddress: an illegal memory access was encountered
原因切り分けに時間がかかりましたが、一度、通ったはずのfowardが後の方でエラーとなることや、NVIDIA-SMIのGPUメモリ使用状況が上限になるとエラーとなっていることがわかり、cupyがGPUのメモリを使いきったことが原因とおおよその見当がつきました。
numpyを使ったプログラムをGPUで動かす方法 を参考に cuda.set_allocator を入れたところ、前よりはepocが進むようになりましたが、やはり途中で止まってしまいました。
import cupy as cp
# 以下を追加
# Declare at first
pool = cp.cuda.MemoryPool(cp.cuda.malloc_managed)
cp.cuda.set_allocator(pool.malloc)
結論
仮想環境構築時にインストールされているcupyではなく、https://cupy.dev/ を参考に、cupy 8.3 から cupy-cuda100 に入れ替えました。もしかしたら、単にバージョンの相性が悪かったただけでcupy 9.1 を普通に選んでインストールすれば良かっただけかもしれませんが、無事にnumpyをcupyに置き換えたプログラムが走るようになりました。
学習時は早くなったと実感できるのですが
Chainer Tutorials : 10_Introduction_to_CuPy.ipynb をローカルで実施した結果は、下記のようになっています。N:10000 の 1.09は微妙です。ちなみに、今にして思えば、cupy入れ替え前では、N:10000のみCPUに負けていたという謎の状況でしたので、それよりは改善しています。
N NumPyでの実行時間 (sec) CuPy での実行時間 (sec) 高速化倍率
----- ------------------------- ------------------------- ------------
10 0.000138521 0.000464439 0.30 x
100 0.00229764 0.00128341 1.79 x
1000 0.0522327 0.0396926 1.32 x
10000 17.228 15.8261 1.09 x
手順
anaconda上で普通にアンインストール、インストールするだけですが、cupy-cuda100 はcondaでは見つからないので、pipでのインストールになります。
conda uninstall cupy
(依存関係でダウングレードするファイルが多数あるようで、yes/noを聞いてくるまで結構、時間がかかりりました。)
pip install cupy-cuda100
conda listの結果(抜粋)
cudatoolkit 10.0.130 0
cudnn 7.6.5 cuda10.0_0
cupy-cuda100 9.1.0 pypi_0 pypi