Ubuntu 20.04 / 18.04 環境で eddy_cuda10.2 (in FSL 6.0.5.x), PyTorch, Tensorflow 2 を使えるようにCUDA 10.2, 11.0, 11.5をセットアップする方法

注意(16 Apr 2023): FSL 6.0.6 から、CUDA 11以降でもeddy_cuda10.2が動くようになりました。したがって、以下の内容はもう古くなっています。新しい記事をご確認ください。

私のメインマシンは Lin4Neuro 18.04 ですが、そろそろ Lin4Neuro 20.04 への移行を考えています。

今、実験機には NVIDIA GeForce RTX 2070 が備え付けられています。
これを使って、FSL 6.0.5 の eddy をGPUが使えるように設定し、なおかつ、Tensorflow, Pytorch といった Deep Learning のフレームワークも使えるようにしたいと思います。

FSL 6.0.5 にはデフォルトで CUDA 10.2 に対応した eddy_cuda10.2 が配布されています。なので、CUDA 10.2を入れることにします。

なお、これは Ubuntu 18.04 でも全く問題なくできることがわかりましたので、タイトルを変更しました。

カーネルヘッダのインストール

  • CUDAのインストールのためにはカーネルヘッダのインストールが必要になります。以下の一文でインストールできます。
sudo apt install linux-headers-$(uname -r)
  • 再起動します。これまでのたくさんの失敗の経験から、しつこく再起動します。
reboot

CUDA 10.2, 11.0, 11.5 のインストール

  • NVIDIA は、最近、とてもわかりやすいサイトを提供してくださっています。cuda 10.2 に関しては、cuda-10.2-download-archive で必要なインストラクションが全部提示されます。

  • Archiveなので、18.04版しかありませんが、20.04でも動作します。

  • 以下のようにインストラクションが出ます。

  • 以下のようにしました。オリジナルと変更したのは、複数のcudaを入れることです。2021年12月17日現在では、cudaは10.0〜11.5まで対応しています。あとで述べますが、Tensorflow のためには、11.0 が必要となります。このため、最新版の11.5, 11.0, 10.2 の3つを入れます。cudaを入れる際、–no-install-recommends をつけて必要最低限のものを入れます

  • (追記) 2022年4月28日にNVIDIAのリポジトリのキーが更新されたため、それにあわせてコマンドを変更しています。

wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64/cuda-ubuntu1804.pin

sudo mv cuda-ubuntu1804.pin /etc/apt/preferences.d/cuda-repository-pin-600

wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64/cuda-keyring_1.0-1_all.deb

sudo dpkg -i cuda-keyring_1.0-1_all.deb 

sudo apt update

sudo apt -y install --no-install-recommends cuda-10-2 cuda-11-0 cuda-11-5

  • ここで再起動します。
reboot
  • 無事に再起動できました。
  • 再度 nvidia-smi を確認します。
$ nvidia-smi
Sat Dec 11 19:02:12 2021       
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 495.29.05    Driver Version: 495.29.05    CUDA Version: 11.5     |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|                               |                      |               MIG M. |
|===============================+======================+======================|
|   0  NVIDIA GeForce ...  On   | 00000000:02:00.0  On |                  N/A |
|  9%   48C    P8    18W / 175W |     62MiB /  7979MiB |      1%      Default |
|                               |                      |                  N/A |
+-------------------------------+----------------------+----------------------+
                                                                               
+-----------------------------------------------------------------------------+
| Processes:                                                                  |
|  GPU   GI   CI        PID   Type   Process name                  GPU Memory |
|        ID   ID                                                   Usage      |
|=============================================================================|
|    0   N/A  N/A       836      G   /usr/lib/xorg/Xorg                 60MiB |
+-----------------------------------------------------------------------------+

cuDNN のインストール

  • ここが複数のバージョンのCUDAを入れるためのキモであることがわかりました。
  • cuDNNは、CUDAのDeep Neural Network用のライブラリです。
  • NVIDIAの CuDNN Archive から入手できます。NVIDIA Developer の登録が必要です。
  • これまで、Ubuntu用の .deb ファイルを入手していましたが、それを使うと、バージョンが新しくなると書き換えられてしまいます。そこで、.tar.gzファイルを入手してマニュアルでインストールします。
  • 今は、CUDA 10.2, 11.0, 11.5 の3つの CUDA をインストールしました。なので、それぞれを入手します。

たとえば、CUDA 11.5 用でしたら、2021年12月17日の時点では、v8.3.0 が使えるので、そこの “cuDNN Library for Linux (x86_64)” を選択します。すると、cudnn-11.5-linux-x64-v8.3.0.98.tgz がダウンロードできますので、それをダウンロードします。

  • これを展開するとディレクトリ名が cuda となり、複数のバージョンがわからなくなるので、作業ディレクトリを作成します。
mkdir cudnn-10.2 cudnn-11.x cudnn-11.5
  • 次のファイルを入手します。cudnn-11.x は、11.0,1,2,3に対応しています。
    • cudnn-10.2: cudnn-10.2-linux-x64-v8.3.0.98.tgz
    • cudnn-11.x: cudnn-11.3-linux-x64-v8.2.1.32.tgz
    • cudnn-11.5: cudnn-11.5-cudnn-11.5-linux-x64-v8.3.0.98.tgz
  • それぞれ展開し、それぞれのバージョンの cuda にコピーします。10.2, 11.0, 11.5 はほぼ繰り返しです。

cd cudnn-10.2
tar xvzf cudnn-10.2-linux-x64-v8.3.0.98.tgz
sudo cp cuda/include/cudnn* /usr/local/cuda-10.2/include
sudo cp cuda/lib64/libcudnn* /usr/local/cuda-10.2/lib64
cd ../cudnn-11.x
tar xvzf cudnn-11.3-linux-x64-v8.2.1.32.tgz
sudo cp cuda/include/cudnn* /usr/local/cuda-11.0/include
sudo cp cuda/lib64/libcudnn* /usr/local/cuda-11.0/lib64
cd ../cudnn-11.5
tar xvzf cudnn-11.5-linux-x64-v8.3.0.98.tgz
sudo cp cuda/include/cudnn* /usr/local/cuda-11.5/include
sudo cp cuda/lib64/libcudnn* /usr/local/cuda-11.5/lib64

CUDAの切り替え

  • Ubuntuには、update-alternativesという機能があり、バージョンの切り替えが比較的容易にできます
  • これを使って3つのcudaを切り替えられるようにしていきます。
  • まず、update-alternatives の選択肢に入るように、update-alternatives –install をします。優先順位はそこまで重要ではないのですが、10.2を優先したいので、この中では一番大きくしました。
sudo update-alternatives --install /usr/local/cuda cuda /usr/local/cuda-11.5 90
sudo update-alternatives --install /usr/local/cuda cuda /usr/local/cuda-11.0 80
sudo update-alternatives --install /usr/local/cuda cuda /usr/local/cuda-10.2 100
  • 次に、update-alternatives –config で選びます。
sudo update-alternatives --config cuda
  • すると次のような画面になります。
$ sudo update-alternatives --config cuda
alternative cuda (/usr/local/cuda を提供) には 3 個の選択肢があります。

  選択肢    パス                 優先度  状態
------------------------------------------------------------
* 0            /usr/local/cuda-11.5    100       自動モード
  1            /usr/local/cuda-10.2    80        手動モード
  2            /usr/local/cuda-11.0    90        手動モード
  3            /usr/local/cuda-11.5    100       手動モード

現在の選択 [*] を保持するには <Enter>、さもなければ選択肢の番号のキーを押してください: 
  • 今の場合、cuda-10.2 を使いたいので 1 を押してEnterをします。

すると、以下のような表示になります。

update-alternatives: /usr/local/cuda (cuda) を提供するためにマニュアルモードで /usr/local/cuda-10.2/ を使います

パスの設定

  • NVIDIAの公式サイトの Post-installation action に、パス設定が記載されています。

  • 私は、できるだけ .bashrc をいじらないでというのを最近、モットーにしているので、.bashrc の中で読み込まれる .bash_aliases に追記します。.bash_aliases はその名の通り、本来はエイリアスの設定を書くものと思いますが、様々なパスをここに書いておくと、.bashrc を直接いじらなくていいので安全かと思います。

  • update-alternatives を併用すると、以下のような記載で大丈夫になります。LD_LIBRARY_PATHは、自分が使い分けをしたいCUDAの lib64 のパスをひたすら書いていきます。

# CUDA
export PATH=/usr/local/cuda/bin${PATH:+:${PATH}}
export LD_LIBRARY_PATH=/usr/local/cuda/lib64:/usr/local/cuda-10.2/lib64:/usr/local/cuda-11.0/lib64:/usr/local/cuda-11.5/lib64${LD_LIBRARY_PATH:+${LD_LIBRARY_PATH}}
  • ターミナルを一度閉じて、再度ターミナルを起動します。

CUDA の確認

  • nvcc –version で NVCC のドライバが確認できます。
$ nvcc --version
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2019 NVIDIA Corporation
Built on Wed_Oct_23_19:24:38_PDT_2019
Cuda compilation tools, release 10.2, V10.2.89
  • CUDA 10.2 のドライバが入ったことが確認できました。

PyTorch のインストール

  • PyTorch の Get Started ページでは、自分の構成をクリックするだけで何をすべきか教えてくれます。Linux, Pip, CUDA 10.2はとてもシンプルな結果になりました。

  • pipを使って一行ですみます。python3-pip が入っていることが前提ですが。
pip3 install torch torchvision torchaudio
  • その後、PyTorchのウェブサイトにしたがって、確認します。
  • Python3 を起動したあとに以下を記載します。5行3列の行列を作成しています。
import torch
x = torch.rand(5, 3)
print(x)

tensor([[0.7864, 0.5164, 0.2328],
        [0.5295, 0.4627, 0.1464],
        [0.9955, 0.1817, 0.9645],
        [0.2252, 0.5114, 0.2045],
        [0.4405, 0.2104, 0.5069]])
  • 問題なくできました。次に、CUDAが動くか確認します。
torch.cuda.is_available()

True

認識できているようです!

Tensorflow のインストール

  • TensorflowのテストはCUDA 10.2ではされていないようです。ソースは こちら。なので、CUDA 11.0のインストールが必要になります。
  • これまでの設定をしていると、Tensorflowのインストールは大きな問題なくできます。
  • tensorflow本体は pip でインストールできます
pip3 install tensorflow

Tensorflowのテスト

  • Tensorflow が GPU を認識できるか確認します。 Tensorflowの本家 の方法に従います。python3を起動して以下を行います。
import tensorflow as tf
gpu_available = tf.test.is_gpu_available()
  • その結果です。
WARNING:tensorflow:From <stdin>:1: is_gpu_available (from tensorflow.python.framework.test_util) is deprecated and will be removed in a future version.
Instructions for updating:
Use `tf.config.list_physical_devices('GPU')` instead.
2021-12-11 21:06:25.921787: I tensorflow/compiler/jit/xla_gpu_device.cc:99] Not creating XLA devices, tf_xla_enable_xla_devices not set
(中略)
tensorflow/core/common_runtime/gpu/gpu_device.cc:1406] Created TensorFlow device (/device:GPU:0 with 7261 MB memory) -> physical GPU (device: 0, name: NVIDIA GeForce RTX 2070, pci bus id: 0000:02:00.0, compute capability: 7.5)

うまくいきました。

以上要約すると、
– FSL 6.0.5 には現時点では CUDA 10.2 用の eddy が搭載されているので、もし、Ubuntu 20.4 で eddy_cuda を使いたかったら CUDA 10.2 を入れるのが近道
– Ubuntu 18.04 用のリポジトリを使って問題なし
– PyTorch はすんなり入る
– Tensorflow は CUDA 10.2 と CUDA 11.0 の両方をインストールすることが必要。cuDNNをtgzでいれるのがポイント。

といった感じです。かなり再現性高くGPUのセットアップができるようになりました。

Print Friendly, PDF & Email

4 thoughts on “Ubuntu 20.04 / 18.04 環境で eddy_cuda10.2 (in FSL 6.0.5.x), PyTorch, Tensorflow 2 を使えるようにCUDA 10.2, 11.0, 11.5をセットアップする方法

  1. いつも大変お世話になっております。こちらの記事のおかげで、スムーズにGPUの設定ができました。ありがとうございます。
    細かいことで恐縮ですが、update-alternativesの優先度の設定ですが、もしかして数字が大きい方が優先されるのではないでしょうか?

    • ご指摘ありがとうございます。調べたらpriorityが高い値が優先ですね。勘違いしていました!あとで記事を修正します。

  2. ピングバック: Ubuntu 18.04 で、NVIDIAのリポジトリを利用してtensorflow-gpu環境を構築するシンプルな方法

金子貴久子 へ返信するコメントをキャンセル

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください