yag's blog

Twitter以上Zenn以下なことを書く場所

GPU/CUDAとPyTorch周りの様々なバージョンを理解する

前置き

GPUを利用したディープラーニングの環境構築において、GPUのドライバやCUDAの諸々の設定は初学者が誰しも嵌る最初の難関と言える。私自身これまではネットの情報をあれこれ試して上手く行けばOKで済ませていたが、この辺で今一度正しく理解しておきたい。そこでこの記事を通して、GPU/CUDAとPyTorchの環境構築で遭遇する様々なバージョンの識別とその意味を理解することを目的とする。なお、細かなインストール方法やエラー対応などは本記事では扱わない。また、グラフィックボード/グラフィックカードと呼ぶべきところをGPUと表現している点もご容赦いただきたい。

[注意] この記事はGPU/CUDA素人が書いているので、細かな用語や名称の間違いが多分に含まれていると思われる。間違っていたらごめんなさい。また、事例として紹介しているバージョン番号は当然ながら時が経つにつれ古くなるので注意。

GPU/CUDA

Compute Capability

7.58.6sm_*と表記されるもの。これは使用するGPUアーキテクチャに応じてサポートされる機能が決まっており、それを表すバージョン番号がCompute Capabilityである。ハードウェアのGPUにはそれぞれこの番号が付いていて、変わることはない。例えば、RTX 3090とRTX 4090では以下のようになっている。

GPU Architecture Name Compute Capability SM Variation
GeForce RTX 3090 Ampere 8.6 sm_86
GeForce RTX 4090 Ada Lovelace 8.9 sm_89

現行GPUのCompute Capability対応表は、以下から確認できる。

developer.nvidia.com

CUDA

10.211.8などと表記されるもの。これはCUDAのバージョンを表す。バージョンごとにサポートするGPUの種類、すなわちCompute Capability (CC) の範囲が決まっている。

CUDA Version min. CC max. CC
CUDA 10.2 3.0 7.5
CUDA 11.8 3.5 11.8

現在インストールしているCUDAのバージョンは、nvccコマンドや/usr/local/cuda/version.{json, txt}などから確認できる。

$ /usr/local/cuda/bin/nvcc --version
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2022 NVIDIA Corporation
Built on Wed_Sep_21_10:33:58_PDT_2022
Cuda compilation tools, release 11.8, V11.8.89
Build cuda_11.8.r11.8/compiler.31833905_0
$ cat /usr/local/cuda/version.json

なお、CUDAの中には大きく分けてCUDA ToolkitとNVIDIA Driverが存在し、そのNVIDIA Driverの中にGPU Kernel Mode DriverとCUDA User-Mode Driverの2つが存在する。後者が次に説明するNVIDIA Driverのこと。

https://docs.nvidia.com/deploy/cuda-compatibility/graphics/CUDA-components.png

CUDA Compatibility :: NVIDIA Data Center GPU Driver Documentation より

NVIDIA Driver

470.57.02515.43.04、もしくはR470R515などと表記されるもの。これはNVIDIA Driverのバージョンを表す。先頭の数字を取ってリリース単位を意味するR515, R510, R470と表記されることもある。

Ubuntuの場合、以下のようにしてGPUに応じたDriverのバージョン一覧および推奨バージョンを取得できる。

$ sudo ubuntu-drivers devices
[...]
vendor   : NVIDIA Corporation
model    : GA102 [GeForce RTX 3090]
driver   : nvidia-driver-470 - third-party non-free
driver   : nvidia-driver-515-server - distro non-free
driver   : nvidia-driver-515-open - distro non-free
driver   : nvidia-driver-520-open - distro non-free recommended
driver   : nvidia-driver-520 - third-party non-free
driver   : nvidia-driver-515 - third-party non-free
driver   : nvidia-driver-510-server - distro non-free
driver   : nvidia-driver-510 - third-party non-free
driver   : nvidia-driver-470-server - distro non-free
driver   : xserver-xorg-video-nouveau - distro free builtin

PyTorch

1.101.12+cu116などと表記されるもの。これはPyTorchのバージョンを表し、対応するCUDAのバージョンを末尾に付与する場合がある。

PyTorchをGPUで動かすにはCUDAやドライバのバージョンをあわせる必要があり、PyTorch公式ページのInstallationの「Compute Platform」の箇所で必要なCUDAのバージョンから選択できる。単純にpip install torchのみを実行すると、2022/10現在ではCUDA 10.2対応のものがインストールされる。そのため、そもそも利用するGPU自体のCompute CapabilityがCUDA 10.2では対応できない場合には、CUDAをダウングレードしただけでは動かないということが起こり得るので注意が必要となる。

使用するGPUのCompute Capabilityを確認し、次に正しいバージョンのCUDA Toolkitを入れ、そしてそれに対応するPyTorchを入れよう。

https://pytorch.org/get-started/locally/

インストールしたPyTorchが対応する各種バージョンを確認する方法は、以下の通り。

CUDA 11.6対応版の場合

In [1]: import torch

In [2]: torch.__version__
Out[2]: '1.12.1+cu116'

In [3]: torch.version.cuda
Out[3]: '11.6'

In [4]: torch.cuda.get_arch_list()
Out[4]: ['sm_37', 'sm_50', 'sm_60', 'sm_70', 'sm_75', 'sm_80', 'sm_86']

In [5]: torch.cuda.get_device_capability()
Out[5]: (8, 6)

CUDA 10.2対応版の場合

In [1]: import torch

In [2]: torch.__version__
Out[2]: '1.12.1+cu102'

In [3]: torch.version.cuda
Out[3]: '10.2'

In [4]: torch.cuda.get_arch_list()
Out[4]: ['sm_37', 'sm_50', 'sm_60', 'sm_70']

In [5]: torch.cuda.get_device_capability()
/home/yag_ays/xxx/.venv/lib/python3.9/site-packages/torch/cuda/__init__.py:146: UserWarning:
NVIDIA GeForce RTX 3090 with CUDA capability sm_86 is not compatible with the current PyTorch installation.
The current PyTorch install supports CUDA capabilities sm_37 sm_50 sm_60 sm_70.
If you want to use the NVIDIA GeForce RTX 3090 GPU with PyTorch, please check the instructions at https://pytorch.org/get-started/locally/

  warnings.warn(incompatible_device_warn.format(device_name, capability, " ".join(arch_list), device_name))
Out[5]: (8, 6)

ここではtorch.cuda.get_device_capability()を実行するとWarningが表示されているが、これは実行環境においてGPUのCompute CapabilityとインストールされているPyTorchのバージョンが合わないというもの。もちろんこのままGPUを使ったディープラーニングのコードを実行してもエラーになるだけなので、PyTorchを再インストールする必要がある。

参考