注意(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のインストールのためにはカーネルヘッダのインストールが必要になります。以下の一文でインストールできます。
1 | sudo apt install linux-headers-$( uname -r) |
- 再起動します。これまでのたくさんの失敗の経験から、しつこく再起動します。
1 | 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のリポジトリのキーが更新されたため、それにあわせてコマンドを変更しています。
01 02 03 04 05 06 07 08 09 10 11 | 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 |
- ここで再起動します。
1 | reboot |
- 無事に再起動できました。
- 再度 nvidia-smi を確認します。
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 | $ 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 となり、複数のバージョンがわからなくなるので、作業ディレクトリを作成します。
1 | 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 はほぼ繰り返しです。
1 2 3 4 | 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 |
1 2 3 4 | 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 |
1 2 3 4 | 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を優先したいので、この中では一番大きくしました。
1 2 3 | 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 で選びます。
1 | sudo update-alternatives --config cuda |
- すると次のような画面になります。
01 02 03 04 05 06 07 08 09 10 11 | $ 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をします。
すると、以下のような表示になります。
1 | 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 のパスをひたすら書いていきます。
1 2 3 | # 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 のドライバが確認できます。
1 2 3 4 5 | $ 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 が入っていることが前提ですが。
1 | pip3 install torch torchvision torchaudio |
- その後、PyTorchのウェブサイトにしたがって、確認します。
- Python3 を起動したあとに以下を記載します。5行3列の行列を作成しています。
1 2 3 4 5 6 7 8 9 | 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が動くか確認します。
1 2 3 | torch.cuda.is_available() True |
認識できているようです!
Tensorflow のインストール
- TensorflowのテストはCUDA 10.2ではされていないようです。ソースは こちら。なので、CUDA 11.0のインストールが必要になります。
- これまでの設定をしていると、Tensorflowのインストールは大きな問題なくできます。
- tensorflow本体は pip でインストールできます
1 | pip3 install tensorflow |
Tensorflowのテスト
- Tensorflow が GPU を認識できるか確認します。 Tensorflowの本家 の方法に従います。python3を起動して以下を行います。
1 2 | import tensorflow as tf gpu_available = tf.test.is_gpu_available() |
- その結果です。
1 2 3 4 5 6 | 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のセットアップができるようになりました。
いつも大変お世話になっております。こちらの記事のおかげで、スムーズにGPUの設定ができました。ありがとうございます。
細かいことで恐縮ですが、update-alternativesの優先度の設定ですが、もしかして数字が大きい方が優先されるのではないでしょうか?
ご指摘ありがとうございます。調べたらpriorityが高い値が優先ですね。勘違いしていました!あとで記事を修正します。
早速のお返事、修正ありがとうございます!
ピングバック: Ubuntu 18.04 で、NVIDIAのリポジトリを利用してtensorflow-gpu環境を構築するシンプルな方法