問題の概要:CUDA対応GPUの計算能力(Compute Capability)確認の重要性
CUDAを利用したAI開発、特に深層学習フレームワーク(PyTorch, TensorFlowなど)の環境構築や、CUDA Toolkitのインストール、カスタムCUDAカーネルのコンパイル時に、以下のようなエラーに遭遇したことはありませんか?
ERROR: Could not find a version that satisfies the requirement torch==1.12.0+cu113
(利用可能なPyTorchのビルドが、自身のGPUのCompute Capabilityに対応していない場合)
nvcc fatal : Unsupported gpu architecture 'compute_86'
(カーネルコンパイル時、指定したアーキテクチャがGPUでサポートされていない)
CUDA error: no kernel image is available for execution on the device
(実行時、バイナリがGPUアーキテクチャと互換性がない)
これらのエラーの根本原因の一つは、使用しているGPUの「計算能力(Compute Capability)」と、インストールしようとしているソフトウェアやコンパイル設定の間のミスマッチです。Compute Capabilityは、GPUのハードウェア世代と機能セットを表すバージョン番号(例:8.6, 7.5, 6.1)です。これを事前に確認せずに環境構築を進めると、上記のエラーで手詰まりになることが頻発します。本記事では、この重要な数値を確実に確認するための複数の方法を詳解します。
原因の解説:なぜCompute Capabilityが必要なのか?
Compute Capabilityは、GPUがサポートする命令セットやハードウェア機能(Tensor Coreの有無、倍精度演算性能など)を定義しています。CUDAで書かれたプログラム(特にPyTorch/TensorFlowのプリコンパイル済みバイナリや、自分でコンパイルするカーネル)は、特定のCompute Capability向けにビルドされます。
例えば、NVIDIA RTX 3090 (Compute Capability 8.6) 向けに最適化された最新のライブラリを、古いGeForce GTX 1060 (Compute Capability 6.1) で実行しようとすると、互換性エラーが発生します。逆に、広く互換性を持たせるために古いアーキテクチャ(例:compute_60)向けにビルドした場合、最新GPUの持つTensor Coreなどの高度な機能を活用できず、性能が最大限引き出せないというトレードオフもあります。したがって、環境構築の第一歩として自身のGPUの正確なCompute Capabilityを把握することは、互換性の確保と性能の最適化の両面で不可欠です。
解決方法:Compute Capabilityを確認する4つの実践的手法
ここからは、実際にコマンドやコードを実行して確認する方法をステップバイステップで説明します。複数の方法を紹介するので、ご自身の環境で実行可能なものをお試しください。
方法1:nvidia-smi + 公式ドキュメントで調べる(最も基本的な方法)
NVIDIAドライバがインストールされていれば、ほとんどの環境で利用できる確実な方法です。
手順:
- ターミナル(コマンドプロンプト)を開き、以下のコマンドを実行します。
nvidia-smi
出力例:
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 525.105.17 Driver Version: 525.105.17 CUDA Version: 12.0 |
|-------------------------------+----------------------+----------------------+
| 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 RTX 4090 On | 00000000:01:00.0 On | N/A |
| 0% 36C P8 20W / 450W | 658MiB / 24576MiB | 0% Default |
| | | N/A |
+-------------------------------+----------------------+----------------------+
この出力からGPUモデル名(ここでは「NVIDIA GeForce RTX 4090」)を確認します。
- 次に、NVIDIAの公式ドキュメント「CUDA GPUs」のページにアクセスします。
- ページ内の表から、自分のGPUモデル名を探し、対応する「Compute Capability」の列の数値を確認します。RTX 4090の場合は「8.9」です。
この方法は、CUDA Toolkitがインストールされていない環境でも使える利点があります。
方法2:CUDA Toolkit付属のdeviceQueryサンプルを実行する(最も確実な方法)
CUDA Toolkitが正しくインストールされている環境では、これが最も詳細な情報を得られる方法です。
手順:
- CUDAサンプルコードがインストールされていることを確認します。インストール時にオプションで外している場合は、再度インストールする必要があるかもしれません。
- ターミナルを開き、deviceQueryサンプルのあるディレクトリに移動し、コンパイル・実行します。典型的なパスは以下の通りです。
# Linuxの場合
cd /usr/local/cuda/samples/1_Utilities/deviceQuery
sudo make
./deviceQuery
# Windowsの場合(VS Developer Command Promptなど)
cd "C:ProgramDataNVIDIA CorporationCUDA Samplesv12.01_UtilitiesdeviceQuery"
msbuild deviceQuery_vs2022.sln /property:Configuration=Release /property:Platform=x64
cd Release
deviceQuery.exe
出力の後半に、以下のような明確な記述があります。
Detected 1 CUDA Capable device(s)
Device 0: "NVIDIA GeForce RTX 3080"
CUDA Driver Version / Runtime Version 12.0 / 12.0
CUDA Capability Major/Minor version number: 8.6 # ← これがCompute Capability
Total amount of global memory: 10240 MBytes (10737418240 bytes)
(68) Multiprocessors, (128) CUDA Cores/MP: 8704 CUDA Cores
...
「CUDA Capability Major/Minor version number: 8.6」という行がそのままCompute Capability (8.6) を示しています。
方法3:Python + PyTorch / TensorFlow を使って確認する(AI開発者向け)
AI開発環境が既に構築されているなら、Pythonスクリプトから簡単に確認できます。
手順 (PyTorch利用):
- Pythonインタラクティブシェルまたはスクリプトを起動します。
- 以下のコードを実行します。
import torch
if torch.cuda.is_available():
gpu_name = torch.cuda.get_device_name(0)
cc_major = torch.cuda.get_device_capability(0)[0]
cc_minor = torch.cuda.get_device_capability(0)[1]
print(f"GPUデバイス名: {gpu_name}")
print(f"Compute Capability: {cc_major}.{cc_minor}")
# あるいは、以下のように一度の関数呼び出しで文字列として取得も可能
print(f"Compute Capability (文字列): {torch.cuda.get_device_capability(0)}")
else:
print("CUDAが利用可能なGPUが見つかりません。")
手順 (NVIDIA提供の`pycuda`または`nvidia-ml-py`ライブラリ利用):
# pycuda.driverを使用する例
import pycuda.driver as cuda
import pycuda.autoinit
dev = cuda.Device(0)
print(f"GPU名: {dev.name()}")
print(f"Compute Capability: {dev.compute_capability_major()}.{dev.compute_capability_minor()}")
# nvidia-ml-pyを使用する例(nvidia-smiのPythonバインディング)
import pynvml
pynvml.nvmlInit()
handle = pynvml.nvmlDeviceGetHandleByIndex(0)
device_name = pynvml.nvmlDeviceGetName(handle)
# 注: pynvmlはCompute Capabilityを直接取得するAPIを提供していません。
# デバイス名から方法1のように推測する必要があります。
print(f"GPU名: {device_name.decode('utf-8')}")
pynvml.nvmlShutdown()
方法4:Windowsレジストリから確認する(Windows環境限定)
GUI操作が可能なWindows環境では、レジストリエディタからも確認できます。
手順:
- 「ファイル名を指定して実行」(Win+R) で `regedit` と入力し、レジストリエディタを起動します。
- 以下のパスに移動します:
HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlClass{4d36e968-e325-11ce-bfc1-08002be10318} - 0000, 0001… といったサブキーの中に、自身のGPU情報が格納されています。各サブキーをクリックし、右ペインに「HardwareInformation.qwMemorySize」などの値があれば、それがGPUのキーです。
- そのキーの右ペインにある「ComputeCapability」というREG_BINARY値を探します。値のデータは「06 01」のように16進数で表示されており、これは「メジャーバージョン=0x06, マイナーバージョン=0x01」、つまりCompute Capability 6.1を表します。
※ レジストリ操作は誤るとシステムに影響を与える可能性があるため、読み取りのみ行い、変更はしないでください。
まとめ・補足情報
GPUのCompute Capabilityの確認は、CUDAを利用するすべてのプロジェクトの出発点です。主要な方法をまとめると以下のようになります。
- 最も手軽で環境を選ばない方法: `nvidia-smi`でGPU名を確認し、公式ドキュメントで照合する(方法1)。
- 最も詳細で確実な方法: CUDA Toolkit付属の`deviceQuery`サンプルを実行する(方法2)。
- AI開発環境が既にある場合: PyTorchの`torch.cuda.get_device_capability()`関数を使う(方法3)。
重要な補足点:
- ノートPCなどに搭載される「Max-Q」デザインのGPUも、同じモデル名であればCompute Capabilityは通常版と変わりません(例:RTX 3080 Laptop GPUもCompute Capability 8.6)。
- 複数GPUを搭載するワークステーションでは、`torch.cuda.get_device_capability(device_index)`のようにデバイスインデックスを指定して、各GPUの能力を個別に確認できます。
- Compute Capabilityは、CUDAのバージョン(11.8, 12.1など)やドライババージョンとは別物です。CUDAバージョンはソフトウェアスタックの上位層、Compute Capabilityはハードウェアの固有能力と理解しましょう。
自身のGPUのCompute Capabilityを正確に把握した上で、PyTorch/TensorFlowのインストール(`cu113`などのサフィックス選択)、CUDA Toolkitのバージョン選定、カスタムカーネルのコンパイルオプション(`-arch=compute_86 -code=sm_86`など)を決定すれば、無用な互換性エラーに悩まされることなく、スムーズにAI開発をスタートさせることができます。