問題の概要:CUDA環境構築時の「Compute Capability」不一致エラー
CUDAを用いた深層学習フレームワーク(PyTorch, TensorFlowなど)のインストールや、CUDAコードのコンパイル時に、以下のようなエラーメッセージに遭遇したことはありませんか?
ERROR: This Pytorch build is not compatible with your GPU compute capability.
(このPyTorchビルドは、あなたのGPUの計算能力と互換性がありません。)
nvcc fatal : Unsupported gpu architecture 'compute_90'
(nvcc 致命的エラー: サポートされていないGPUアーキテクチャ 'compute_90')
No kernel image is available for execution on the device
(デバイス上で実行可能なカーネルイメージがありません)
これらのエラーは、使用しているGPUの「計算能力(Compute Capability)」と、インストールしようとしているCUDAツールキットやフレームワークのバイナリ、またはコンパイル時に指定したアーキテクチャ設定が一致していないことが原因で発生します。Compute Capabilityは、GPUの世代やアーキテクチャを表す数値(例:7.5, 8.6, 9.0)であり、これが開発環境の構築において最も基本的かつ重要な情報の一つです。本記事では、このCompute Capabilityを正確に確認する複数の方法を詳しく解説します。
原因の解説:なぜCompute Capabilityが重要なのか?
Compute Capability(CC)は、NVIDIA GPUのハードウェアの世代と機能セットを定義するバージョン番号です。「SMバージョン」とも呼ばれます。この番号は、メジャー番号とマイナー番号で構成され(例:8.6)、以下の点で決定的な役割を果たします。
- CUDAバイナリの互換性: PyTorchやTensorFlowなどのプリコンパイル済みパッケージ(wheelファイル)は、特定のCCを持つGPU向けにビルドされています。自分のGPUのCCがパッケージの対応範囲外だと、上記のエラーが発生します。
- CUDAコードのコンパイル:
nvccコンパイラでCUDAカーネルをコンパイルする際、-arch=compute_XXや-gencodeオプションでターゲットCCを指定する必要があります。存在しない未来のCC(例:手持ちのRTX 4090(CC 8.9)に対してcompute_90を指定)や、古すぎるCCを指定するとコンパイルエラーや実行時エラーになります。 - 利用可能な機能: Tensor Coreの有無(CC 7.0以降)や、その性能はCCによって決まります。最適化されたコードを書く際にも必須の知識です。
したがって、環境構築の最初のステップとして、自身のGPUのCompute Capabilityを確認することは、後続のあらゆる作業の土台となります。
解決方法:Compute Capabilityを確認する4つの実用的な方法
ここからは、実際にコマンドやコードを実行してCompute Capabilityを確認する方法をステップバイステップで説明します。複数の方法を紹介するので、お使いの環境に合わせて選択してください。
方法1: NVIDIA公式ドキュメントでモデル名から調べる
GPUのモデル名(例:GeForce RTX 3080)が分かっている場合、最も手軽な方法です。
手順:
- 使用しているGPUの正確なモデル名を確認します(PCのスペックシートやデバイスマネージャーなど)。
- NVIDIAの公式ページ「CUDA GPUs」にアクセスします。
- ページ内の表から該当するGPUファミリー(例:GeForce RTX 30 Series)を探し、自分のモデルのCompute Capabilityを確認します。
注意点: ノートPCなどに搭載されるモバイル版GPU(例:RTX 3080 Laptop GPU)は、同じ名前でもデスクトップ版とCCが異なる場合があるため、この方法では不正確な可能性があります。正確を期すなら、以下のプログラムによる確認方法が確実です。
方法2: nvidia-smiコマンドとNVIDIA-SMIによる確認(標準的な方法)
NVIDIAドライバが正しくインストールされている環境であれば、端末(コマンドプロンプト、PowerShell、ターミナル)で以下のコマンドを実行します。
nvidia-smi
このコマンドを実行すると、以下のようなGPUの概要が表示されます。
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 535.154.05 Driver Version: 535.154.05 CUDA Version: 12.2 |
|-------------------------------+----------------------+----------------------+
| 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 3080 Off| 00000000:01:00.0 On | N/A |
| 30% 45C P8 20W / 320W | 456MiB / 10240MiB | 0% Default |
| | | N/A |
+-------------------------------+----------------------+----------------------+
nvidia-smiは多くの情報を提供しますが、Compute Capabilityは表示されません。ここで確認できる「CUDA Version」は、ドライバがサポートする最大のCUDAランタイムバージョンであり、CCとは別物です。しかし、このコマンドでGPUが正しく認識されていることを確認した上で、次のプログラムを用いた方法に進みます。
方法3: deviceQueryサンプルプログラムを実行する(最も確実な方法)
CUDA Toolkitがインストールされている環境では、付属するサンプルプログラムdeviceQueryをコンパイル・実行することで、詳細なGPU情報を取得できます。
手順:
- CUDAサンプルコードがあるディレクトリに移動します。典型的なパスは以下の通りです。
- Windows:
C:ProgramDataNVIDIA CorporationCUDA SamplesvXX.Xbinwin64Debug(既にコンパイル済みの.exeがある場合) - Linux:
/usr/local/cuda/samplesまたは~/NVIDIA_CUDA-XX.X_Samples
既にコンパイル済みの実行ファイルがない場合は、ソースからコンパイルします。
- Windows:
- ソースからコンパイルする場合(例:Linux):
cd ~/NVIDIA_CUDA-12.x_Samples/1_Utilities/deviceQuery make ./deviceQuery - プログラムを実行すると、以下のような出力の一部にCompute Capabilityが表示されます。
Detected 1 CUDA Capable device(s)
Device 0: "NVIDIA GeForce RTX 3080"
CUDA Driver Version / Runtime Version 12.2 / 12.2
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
...
この例では、Compute Capabilityは 8.6 であることが分かります。この方法が、ハードウェアの情報を直接取得する最も確実な方法です。
方法4: Python (PyTorch / TensorFlow) を使って確認する
既にPython環境が構築されているAI開発者にとっては、最も実用的な方法です。PyTorchまたはTensorFlowを利用して確認できます。
PyTorchを使用する場合:
import torch
if torch.cuda.is_available():
gpu_count = torch.cuda.device_count()
for i in range(gpu_count):
prop = torch.cuda.get_device_properties(i)
print(f"GPU {i}: {prop.name}")
print(f" Compute Capability: {prop.major}.{prop.minor}")
# または、以下のように直接文字列としても取得可能
cc = torch.cuda.get_device_capability(i)
print(f" Compute Capability (tuple): {cc}")
else:
print("CUDA is not available.")
実行結果例:
GPU 0: NVIDIA GeForce RTX 3080
Compute Capability: 8.6
Compute Capability (tuple): (8, 6)
TensorFlowを使用する場合:
import tensorflow as tf
gpus = tf.config.list_physical_devices('GPU')
if gpus:
for gpu in gpus:
details = tf.config.experimental.get_device_details(gpu)
# TensorFlow 2.xでは、get_device_detailsからcompute_capabilityを取得できる
if 'compute_capability' in details:
print(f"GPU: {gpu.name}")
print(f" Compute Capability: {details['compute_capability']}")
else:
print("No GPU found.")
これらのPythonスクリプトを実行することで、プログラミング環境から直接、正確なCompute Capabilityを取得できます。
コード例・コマンド例 まとめ
主要な確認コマンドとコードを再掲します。
# 1. GPU状態の確認 (CCは表示されない)
nvidia-smi
# 2. deviceQueryプログラムの実行 (CCを確認する最も確実な方法)
# (CUDA Samplesディレクトリ内で)
./deviceQuery
# 3. Python (PyTorch) による確認
python -c "import torch; print(f'CC: {torch.cuda.get_device_capability(0)}')"
# 4. シェルコマンドから直接問い合わせる (Linux, WSL2環境など)
# もし`nvidia-cuda-mps-control`ツールが利用可能な場合
echo "get_device_attribute 75 0" | nvidia-cuda-mps-control
# 75はCompute Capabilityを表す属性ID。出力は16進数なので変換が必要。
まとめ・補足情報
CUDAを利用した開発や学習環境を構築する際、自分のGPUのCompute Capabilityを最初に確認するという習慣は、後続の互換性エラーを未然に防ぐ「最強の予防策」です。本記事で紹介した4つの方法の中では、方法3の`deviceQuery`サンプルの実行がハードウェア情報を直接取得するため最も信頼性が高く、方法4のPythonスクリプトが開発現場では最も手軽で実用的です。
重要な補足:
- CUDA ToolkitのバージョンとCompute Capabilityは無関係ではありません。新しいCC(例:9.0)をフルサポートするには、新しいバージョンのCUDA Toolkitが必要です。NVIDIAのリリースノートで対応関係を確認しましょう。
- クラウドGPU(AWS EC2 G4/G5インスタンス、Google Cloud A2/A3 VMs、Azure NC/NDシリーズなど)を利用する場合も、インスタンスタイプからGPUモデルを特定し、そのCCを調べてください。
- 「このGPUで最新のPyTorchは動くのか?」という疑問は、フレームワークの公式ドキュメント(例:PyTorchのGet Startedページ)にある「Supported CUDA versions」と、自分のGPUのCC、そしてプリビルド済みバイナリがサポートするアーキテクチャ(多くの場合、多くのバージョンが含まれる`manylinux` wheel)を照らし合わせることで解決できます。
環境構築でつまずいたら、まずはこの第一歩——Compute Capabilityの確認——に立ち戻ることで、問題解決への道筋が明確になるでしょう。