4
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Ubuntu20.04にPythonとTensorFlowとCUDAとnvidia-driver(とcuDNN)を入れて機械学習GPU環境構築 libcudart.so.11のエラーなど

Last updated at Posted at 2022-02-09

概要

大学に入って念願のゲーミングPCを手に入れたが持て余していたので、Ubuntuで機械学習(ディープラーニング)環境を整えようとしたら、仮想環境じゃLinuxがGPUを認識しないとか日本語remixだとネットにつながらないとかEFIが勝手にWindowsとデュアルブートになるとか色々あった。
TensorFlow周りでも苦労したので後日再度環境構築をするために手順をまとめる。

環境

  • CPU:Intel Core i5-12600KF
  • GPU:GeForce RTX 3060
  • OS:Ubuntu 20.04

依存関係・バージョン確認

機械学習環境はPythonとTensorFlowとCUDAとnvidia-driverのバージョンが一致してないと動かないらしい。
実際、最新グラボだし全部新しいソフトなら動くだろうと思ったら動かなかった。(そしてこれが原因でのちにエラー祭り)

それぞれの依存関係が確認できる場所はいくつかある。CUDAのWikipedia英語版とか、CUDA Toolkitのドキュメントとか。ただどうにも情報が古かったり錯綜していたので、自分はTensoFlowのリファレンスを参考にして決めた。
グラボがRTX 3060なのでCUDA 11.1以降でなければならず、

  • Python 3.8
  • TensorFlow 2.6
  • CUDA 11.2
  • nvidia-driver 460
  • cuDNN 8.1

とした。

pyenvによるPythonのインストール

Pythonのバージョン管理を(形だけでも)したかったので入れる。
Macと違って入れるのがまあまあ大変。

基本的なパッケージを入れてなかったら入れる。

sudo apt install git wget curl

/etc/apt/sources.list

deb-src http://archive.ubuntu.com/ubuntu/ focal-updates main

sudo nano /etc/apt/sources.listなどで追加し、下記を実行。

sudo apt build-dep python3.8

参考サイトによるとPythonをソースコードからビルドするのに必要なパッケージをsources.listのURLから参照して落としてるらしいが、これ3.9と3.8で違ったらどうなるのだろうか。

必要パッケージを手動で入れることも可。詳しくはPython Developer's Guid参照。

sudo apt install -y libffi-dev libssl-dev zlib1g-dev \
    liblzma-dev tk-dev libbz2-dev libreadline-dev \
    libsqlite3-dev libopencv-dev build-essential

git cloneでソースコードを落とす。

git clone https://github.com/pyenv/pyenv.git ~/.pyenv

.bashrcにパスを追加。source .bashrcで再読込み。

export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init -)"

可能なバージョン一覧

pyenv install --list

Pythonのインストール。

pyenv install 3.8.12

Pythonの入ってるバージョンを確認。*が現在。

pyenv versions

* system
  3.8.12
  3.9.10

使いたいバージョンに切り替え。

pyenv global 3.8.12

globalじゃなくてディレクトリ下のみ変更のlocalもある。

実際に切り替わっているか確認。

python3 -V

Python 3.8.12

ここで切り替わってなかったらパス周りを疑う。

参考
pyenv README
Ubuntu 20.04 で pyenv を使用して Python を導入する(大変助かりました)
ubuntu 20.04 / 18.04 に pyenv をインストール
pyenvとpyenv-virtualenvの自分流使い方

venvによるPythonライブラリの管理

TensorFlow公式が推奨していたのでやれたらやる。自分はやり忘れた。
これで直下にvenv用の環境ができる。

python3 -m venv [venv_name]

有効化。仮想環境に入ると先頭に(venv_name)が追加される。

source [venv_name]/bin/activate

無効化。

deactivate

参考
venv: Python 仮想環境管理

TensorFlow 2.6のインストール

sudo pipをできるだけ使わない。pip単体を使う。
環境が破壊される可能性あり。

pipで入れる。

pip install tensorflow==2.6

入ったか確認。

pip show tensorflow

Name: tensorflow
Version: 2.6.0
Summary: TensorFlow is an open source machine learning...

なおKerasのバグが2.6.0にはあるらしくKerasコード実行時に引っかかった。Kerasを使う場合は2.5へのダウングレードか修正版の2.6.2を推奨。
How to fix error: Cannot register 2 metrics with the same name: /tensorflow/api/keras/optimizers

CUDA 11.2のインストール

関門その1。
公式サイトから、CUDA ToolkitというWebページの案内に従って条件を指定するとインストール用のコマンドが表示される。CUDA Toolkit Archiveでほしいバージョンを探してもいいが、ググっても早い。
CUDA Toolkit 11.2 Downloads

一番下のInstaller Typeは3つとも試したが、deb(network)はそのままコピペすると最新版が入る罠、runfile(local)は自分はあまりうまく行かなかったので、とくに根拠はないがdeb(local)を選ぶ。多分どれでもいい。
バージョン指定したい場合は最後をcuda-11-2とすればいい。

これはCUDA Toolkit 11.2のUbuntu20.04 x86_64のdeb(local)。

wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2004/x86_64/cuda-ubuntu2004.pin
sudo mv cuda-ubuntu2004.pin /etc/apt/preferences.d/cuda-repository-pin-600
wget https://developer.download.nvidia.com/compute/cuda/11.2.0/local_installers/cuda-repo-ubuntu2004-11-2-local_11.2.0-460.27.04-1_amd64.deb
sudo dpkg -i cuda-repo-ubuntu2004-11-2-local_11.2.0-460.27.04-1_amd64.deb
sudo apt-key add /var/cuda-repo-ubuntu2004-11-2-local/7fa2af80.pub
sudo apt-get update
sudo apt-get -y install cuda

そしてどういう理屈か分からないが、上記のコードでは自分はうまく行かなかった。後述の方法でバージョンを確認すると、nvidia-smidpkg -l | grep cudaでは確かに11.2が確認できるが、/usr/localcudaから始まるディレクトリが一切なかった。あとnvcc -Vが動かない。

結果自分の場合、最後のコードを、

sudo apt-get install cuda-toolkit-11-2

にするとうまく行った。
/usr/localcuda-11.2というディレクトリがコマンド後に生成されたのも確認。どうもCUDA Toolkitにnvidia-driverも入ってて、そのおかげでうまくworkしたっぽいが、原因はよくわからない。こちらを参考にした。

.bashrcに下記を追加。CUDAのエラーはパス周りに多い気がする。

# ドキュメント準拠
export PATH=/usr/local/cuda-11.2/bin${PATH:+:${PATH}}
export LD_LIBRARY_PATH=/usr/local/cuda-11.2/lib64${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}

# nvidia-driverを入れる場合はこっちでも動く
export PATH="/usr/local/cuda/bin:$PATH"
export LD_LIBRARY_PATH="/usr/local/cuda/lib64:$LD_LIBRARY_PATH"

再起動後バージョン確認。

nvcc -V

nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2021 NVIDIA Corporation

こちらも可。

dpkg -l | grep cuda

ii  cuda-command-line-tools-11-2               11.2.2-1                              amd64        CUDA command-line tools
ii  cuda-compiler-11-2                         11.2.2-1                              amd64        CUDA compiler

nvcc -V時にsudo apt install nvidia-cuda-toolkitと帰ってきた場合

nvcc -Vと入れたときに、sudo apt install nvidia-cuda-toolkitと出た場合、従わないことを推奨する。どうも古いCUDA 10を入れてしまうらしく2つのバージョンが同居して滅茶苦茶になる。ただ多分こんな現象うちだけだろう。

参考
CUDA Toolkit 11.2 ドキュメント

nvidia-driver 460のインストール

前述の理由から、sudo apt-get install cuda-toolkit-11-2でCUDAを入れた場合、同梱されてて必要ない可能性もあるが一応入れる。

前述のCUDAを入れるコマンドのいくつかに、例えばsudo dpkg -i cuda-repo-ubuntu2004-11-2-local_11.2.0-460.27.04-1_amd64.debの後半、7桁の数字がdriverのバージョンらしいので念の為それに合わせる。

sudo add-apt-repository ppa:graphics-drivers/ppa
sudo apt update
sudo apt install nvidia-driver-460

インストール後/usr/localcudacuda-11という2つのディレクトリが創られるのを確認。
ただのこの2つとCUDA-11.2は中身が一緒っぽい。

再起動後バージョン確認。

nvidia-smi

+-----------------------------------------------------------------------------+
| NVIDIA-SMI 460.106.00   Driver Version: 460.106.00   CUDA Version: 11.2     |
|-------------------------------+----------------------+----------------------+

こちらも可。

dpkg -l | grep nvidia

ii  libnvidia-cfg1-460:amd64                   460.106.00-0ubuntu1                   amd64        NVIDIA binary OpenGL/GLX configuration library
ii  libnvidia-common-460                       460.106.00-0ubuntu1                   all          Shared files used by the NVIDIA libraries

cuDNN 8.1のインストール

関門その2。
cuDNNはTensorFlowの学習速度の高速化ができるソフトウェアらしく、tfに必ずしも必要というわけではないが、参考にした大抵のブログでは入れていたので自分も入れる。唯一コマンドラインでインストールしないソフトウェアだが、これCUIのLinuxだとどうするんだろうか。

古い情報が多かったのでcuDNNのドキュメントを見る。

cuDNN Archiveで目的のバージョンとCPUアーキテクチャに合致するファイルをすべて落とす。
今回は

  • cuDNN Runtime Library for Ubuntu20.04 x86_64 (Deb)
  • cuDNN Developer Library for Ubuntu20.04 x86_64 (Deb)

の2つ。

ドキュメントを読むとUbuntu20.04なら2つで良さそうだが、多くの参考にしたサイトでは3つなので正直良くわからない。
ダウンロードしたファイルを実行。

sudo dpkg -i libcudnn8_8.1.0.77-1+cuda11.2_amd64.deb
sudo dpkg -i libcudnn8-dev_8.1.0.77-1+cuda11.2_amd64.deb

バージョン確認。

dpkg -l | grep cudnn

ii  libcudnn8                                  8.1.0.77-1+cuda11.2                   amd64        cuDNN runtime libraries
ii  libcudnn8-dev                              8.1.0.77-1+cuda11.2                   amd64        cuDNN development libraries and headers

参考
cuDNN 8.1 ドキュメント

動作確認

下記コードを実行してエラーが出ずに動いているか確認。

python3 -c "import tensorflow as tf; print( tf.__version__ )"

YEAR-MONTH-DAY TIME: I tensorflow/stream_executor/platform/default/dso_loader.cc:53] Successfully opened dynamic library libcudart.so.11.0
2.6.0

TensorFlowがGPUを認識しているか確認。

python3 -c "from tensorflow.python.client import device_lib; print(device_lib.list_local_devices())"

...
device_type: "GPU"
...

GPUが表示されていれば成功。CPUのみなら失敗。

参考
TensorFlow 2.7(GPU 対応可能), Keras, scikit-learn, MatplotLib, Python 用 opencv-python 4.3 のインストール(Windows 上)

Kerasで実験

Jupyter notebookを入れてKerasを適当に動かす。せっかくなのでCNNで。
コードはKeras本から写経したものを流用。

TensorFlow 2.6.0だとKerasが動かないバグがあるので2.5か2.6.2に変える。
How to fix error: Cannot register 2 metrics with the same name: /tensorflow/api/keras/optimizers

from tensorflow.keras import layers
from tensorflow.keras import models
from tensorflow.keras.datasets import mnist
from tensorflow.keras.utils import to_categorical

model = models.Sequential()
model.add(layers.Conv2D(32, (3, 3), activation='relu', input_shape=(28, 28, 1)))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(64, (3, 3), activation='relu'))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(64, (3, 3), activation='relu'))

model.add(layers.Flatten())
model.add(layers.Dense(64, activation='relu'))
model.add(layers.Dense(10, activation='softmax'))

model.summary()

(train_images, train_labels), (test_images, test_labels) = mnist.load_data()
train_images = train_images.reshape((60000, 28, 28, 1))
train_images = train_images.astype('float32') / 255
test_images = test_images.reshape((10000, 28, 28, 1))
test_images = test_images.astype('float32') / 255
train_labels = to_categorical(train_labels)
test_labels = to_categorical(test_labels)

model.compile(optimizer='rmsprop',
             loss='categorical_crossentropy',
             metrics=['accuracy'])
model.fit(train_images, train_labels, epochs=5, batch_size=64)

test_loss, test_acc = model.evaluate(test_images, test_labels)

test_acc

1 epochあたり5-10s程度かかっている。Google colabでは同じコードで10-20程度。とてもはやい。

参考
PythonとKerasによるディープラーニング(とてもよい本)

トラブルシューティング(ソフトウェアの削除など)

便利コマンド

バージョンの確認

# python
python3 -V
# tensorflow
pip show tensorflow

# nvidia-driver
nvidia-smi
# CUDA
nvcc -V

# cuda,nvidia,cudnn
dpkg -l | grep cuda
dpkg -l | grep nvidia
dpkg -l | grep cudnn

TensorFlowの動作確認

# tensorflowの動作
python3 -c "import tensorflow as tf; print( tf.__version__ )"

# tensorflowがGPUを認識してるか
python3 -c "from tensorflow.python.client import device_lib; print(device_lib.list_local_devices())"

ソフトウェアの削除

# python
pyenv uninstall 3.8.12

# tensoflow
pip uninstall tensorflow
# 依存関係ごと削除
pip-autoremove tensorflow

# CUDA
sudo apt-get --purge remove cuda-*
# CUDAドキュメント版
sudo apt-get --purge remove "*cublas*" "*cufft*" "*curand*" "*cusolver*" "*cusparse*" "*npp*" "*nvjpeg*" "cuda*" "nsight*"

# nvidia-driver
sudo apt-get --purge remove nvidia-*
# CUDAドキュメント版
sudo apt-get --purge remove "*nvidia*"

# cuDNNは勝手に消えるっぽい

依存関係の削除

sudo apt autoremove
sudo apt autoclean

アップデート/アップグレード

sudo apt update
sudo apt upgrade

遭遇したエラー

dlerror: libcurand.so.11: cannot open shared object file: No such file or directoryなど

python3 -c "import tensorflow as tf; print( tf.__version__ )"と入れると帰ってきた。どうも未だに直されてないバグの一つらしい。

findなどでファイルを探しパスをつなぎ直すと解消できるらしいが、自分はそもそもそんなファイルが存在しなかった。

sudo apt-get install cuda-toolkit-11-2

で解決した。

sudo apt install nvidia-cuda-toolkit

nvcc -Vが作動しない場合はnvidia-driverの不良の可能性が高い。
同様にsudo apt-get install cuda-toolkit-11-2で解決。

参考にしたサイト

ubuntuにCUDA、nvidiaドライバをインストールするメモ
UbuntuにNVIDIAドライバ、CUDA、 cuDNNをインストールする方法(2020年8月)
【Ubuntu】NVIDIAドライバ・CUDA・CUDNNをインストールして深層学習環境を整える
TensorFlow on DockerでGPUを使えるようにする方法
Ubuntu18.04にNVIDIAとCUDAを入れ直すことに
Ubuntu 18.04 で機械学習環境 ( cuda 10.0 + cudnn7.4 + Pytorch 1.7.1 ) の構築
深層学習 Ubuntu 20.04 に Tensorflow GPU をインストール

4
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?