この記事では研究室のPCにCUDA10.1+CuDNN7.6を入れて,tensorflow2.3を動かそうとしたときに発生したエラーの解決方法について解説します.
1. 今すぐにでも解決したい方向け
- 「
find /usr -name libcublas*
」を実行 - 「libcublas.so.10」と「libcublasLt.so.10」のパスを覚えておく(仮にパスを/A/libcublas.so.10と/B/libcublasLt.so.10とする)
- 「
sudo ln -s /A/libcublas.so.10 /usr/local/cuda-10.1/lib64/libcublas.so.10
」を実行 - 「
sudo ln -s /A/libcublasLt.so.10 /usr/local/cuda-10.1/lib64/libcublasLt.so.10
」を実行
2. 今回の現象の原因
CUDA10.1では, libcublas.so.10がCUDA10.1用のディレクトリである「/usr/local/cuda-10.1」内に正常に生成されません.この現象はNVIDIAのフォーラムにも投稿されています.
3. 解決方法
「/usr」ディレクトリ内のどこかに libcublas.so.10 が生成されているので,まずは以下のを使用して生成位置を探します.
find /usr -name libcublas*
私の環境での実行結果を以下に示しておきます.私の環境では, libcublas.so.10は「 /usr/local/cuda-10.2/targets/x86_64-linux/lib/libcublas.so.10 」にありました.(ちなみに,CUDA10.2はインストールしていません!?)
$ find /usr -name libcublas*
/usr/share/doc/libcublas-dev
/usr/share/doc/libcublas10
/usr/local/cuda-10.1/doc/man/man7/libcublas.so.7
/usr/local/cuda-10.1/doc/man/man7/libcublas.7
/usr/local/cuda-10.2/targets/x86_64-linux/lib/libcublas_static.a
/usr/local/cuda-10.2/targets/x86_64-linux/lib/libcublasLt.so.10
/usr/local/cuda-10.2/targets/x86_64-linux/lib/stubs/libcublasLt.so
/usr/local/cuda-10.2/targets/x86_64-linux/lib/stubs/libcublas.so
/usr/local/cuda-10.2/targets/x86_64-linux/lib/libcublas.so.10
/usr/local/cuda-10.2/targets/x86_64-linux/lib/libcublasLt.so
/usr/local/cuda-10.2/targets/x86_64-linux/lib/libcublas.so.10.2.3.254
/usr/local/cuda-10.2/targets/x86_64-linux/lib/libcublasLt_static.a
/usr/local/cuda-10.2/targets/x86_64-linux/lib/libcublasLt.so.10.2.3.254
/usr/local/cuda-10.2/targets/x86_64-linux/lib/libcublas.so
上記の出力の内,「libcublas.so.10」と「libcublasLt.so.10」が存在するパスを覚えておいてください.
次に,先ほどの結果で 分かった「libcublas.so.10」と「libcublasLt.so.10」のパスを使用して,以下のコマンドで「/usr/local/cuda-10.1」にシンボリックリンクを張ります.
sudo ln -s 「libcublas.so.10」のパス /usr/local/cuda-10.1/lib64/libcublas.so.10
sudo ln -s 「libcublasLt.so.10」のパス /usr/local/cuda-10.1/lib64/libcublasLt.so.10
私の環境では以下のようになります.
$ sudo ln -s /usr/local/cuda-10.2/targets/x86_64-linux/lib/libcublas.so.10 /usr/local/cuda-10.1/lib64/libcublas.so.10
$ sudo ln -s /usr/local/cuda-10.2/targets/x86_64-linux/lib/libcublasLt.so.10 /usr/local/cuda-10.1/lib64/libcublasLt.so.10
また,別の解決法として, 「libcublas.so.10」と「libcublasLt.so.10」 が生成されていたディレクトリに直接LD_LIBRARY_PATHを通してもよいですね.
4. 解決しない場合
tensorflow2.3では,LD_LIBRARY_PATHに「/usr/local/cuda/lib64」や 「/usr/local/cuda-10.1/lib64」 を追加していない場合,上記の手法を実行してもエラーは解決しません.~/.bash_profileなどに「export LD_LIBRARY_PATH=/usr/local/cuda-10.1/lib64:${LD_LIBRARY_PATH}
」を記載してください.