【CUDA】GPUの計算能力(Compute Capability)を確認する方法:エラー回避と環境構築の必須ステップ

問題の概要:CUDA対応GPUの計算能力(Compute Capability)確認の重要性

CUDAを用いたAI開発、特に深層学習フレームワーク(PyTorch, TensorFlowなど)の環境構築や、CUDA Toolkitのインストール、カスタムCUDAカーネルのコンパイル時に、以下のようなエラーに遭遇したことはありませんか?

ERROR: Unsupported gpu architecture 'compute_86'
(PyTorchのビルド時や一部のライブラリインストール時)
No kernel image is available for execution on the device
(カスタムCUDAコード実行時)
This version of PyTorch/TensorFlow is not built with support for your GPU.
(フレームワーク実行時)

これらのエラーの根本原因の一つが、GPUの計算能力(Compute Capability)の不一致です。計算能力は、GPUの世代とマイクロアーキテクチャを表すバージョン番号(例:8.6, 7.5, 6.1)です。CUDA Toolkitや深層学習フレームワークは、特定の計算能力に対応したバイナリしか含んでおらず、自分のGPUの計算能力が対応範囲外だと、上記のようなエラーが発生します。本記事では、この重要な数値を確認するための複数の実践的な方法を詳しく解説します。

原因の解説:なぜ計算能力(Compute Capability)が問題になるのか?

計算能力は、NVIDIA GPUがサポートするハードウェア機能のセットを定義します。新しい計算能力ほど、より高度な命令セットやメモリ構造をサポートしています。ソフトウェア側(CUDAコンパイラ `nvcc` など)は、このターゲットとなる計算能力を指定してコードをコンパイルする必要があります。

主要な問題点は以下の3つです。

  • プリコンパイル済みバイナリの不一致: PyTorchやTensorFlowの公式pipパッケージは、広く使われるいくつかの計算能力(例:3.7, 5.0, 6.0, 7.0, 7.5, 8.0)向けにのみコンパイルされています。もしあなたのGPUが比較的新しいアーキテクチャ(例:Compute Capability 8.6, 8.9, 9.0)の場合、対応するバイナリが含まれていないため、フレームワークがGPUを認識できないか、性能が大幅に低下します。
  • CUDAコードのコンパイルエラー: 自身でCUDA C++コードを書いて `nvcc` でコンパイルする際、`-arch=compute_XX` や `-gencode` オプションで適切な計算能力を指定する必要があります。指定が間違っている、または指定がないと、カーネルを実行できません。
  • CUDA Toolkitの互換性: 各CUDA Toolkitバージョンは、特定の範囲の計算能力をサポートします。あまりに古いGPUは新しいCUDA Toolkitでサポート外になることがあります。

したがって、環境構築の最初のステップとして、自身のGPUの計算能力を正確に把握することが、後続のあらゆるトラブルを未然に防ぐカギとなります。

解決方法:計算能力(Compute Capability)を確認する4つの実践的手順

方法1: NVIDIA公式ドキュメントでGPUモデルから調べる

最も基本的な方法です。ご自身のGPUモデル名(例:GeForce RTX 4090, Tesla V100, RTX A6000)が分かれば、NVIDIAの公式ページで仕様を確認できます。

手順:

  1. NVIDIAの製品ページまたはCUDA対応GPUリストにアクセスします。
  2. 自分のGPUのアーキテクチャ(Ampere, Ada Lovelace, Hopperなど)または製品名を探します。
  3. 「Compute Capability」の欄を確認します。

この方法は、GPUを購入前や物理的に触れないリモート環境の情報を調べる際に有効です。

方法2: nvidia-smiコマンドとNVIDIA Driverの情報から推測する

GPUが搭載されたマシンにログインできる場合、最も簡単にGPUモデルを確認できるコマンドです。計算能力そのものは表示されませんが、GPU名から方法1と組み合わせて判断します。

コマンド例:

nvidia-smi

出力例:

+-----------------------------------------------------------------------------+
| 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. |
|===============================+======================+======================|
|   0  NVIDIA GeForce RTX 4090    On  | 00000000:01:00.0  On |                  N/A |
|  0%   45C    P8    20W / 450W |    689MiB / 24564MiB |      0%      Default |

この例では「NVIDIA GeForce RTX 4090」と表示されています。公式リストによれば、このGPUの計算能力は8.9です。

方法3: deviceQueryサンプルプログラムを実行する(最も確実な方法)

CUDA Toolkitに付属するサンプルプログラムをコンパイル・実行すると、計算能力を含むGPUの詳細なプロパティを直接取得できます。これが最も確実で推奨される方法です。

手順:

  1. CUDA Toolkitがインストールされていることを確認します。
  2. サンプルソースコードがあるディレクトリに移動します。通常は `/usr/local/cuda/samples` または `C:ProgramDataNVIDIA CorporationCUDA Samples` にあります。
  3. `deviceQuery` サンプルをビルドして実行します。

コマンド例 (Linux):

# サンプルディレクトリに移動
cd /usr/local/cuda/samples/1_Utilities/deviceQuery
# サンプルをビルド
sudo make
# 実行
./deviceQuery

出力例 (抜粋):

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  <-- これが計算能力
  Total amount of global memory:                 10240 MBytes (10737418240 bytes)
  (68) Multiprocessors, (128) CUDA Cores/MP:     8704 CUDA Cores
  GPU Max Clock rate:                            1710 MHz (1.71 GHz)

このように、「CUDA Capability Major/Minor version number: 8.6」 という形で、メジャーバージョンとマイナーバージョンが明確に表示されます。計算能力は「8.6」です。

方法4: Python (PyTorch / TensorFlow) を使ってプログラムで確認する

AI開発環境が既に構築されているなら、Pythonスクリプトから簡単に確認できます。

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}")
        print(f"  Total Memory: {prop.total_memory / 1e9:.2f} GB")
else:
    print("CUDA is not available.")

出力例:

GPU 0: NVIDIA GeForce RTX 3060
  Compute Capability: 8.6
  Total Memory: 12.00 GB

NVIDIA提供の`pynvml`ライブラリを使用する場合:

# まずpynvmlをインストール: pip install pynvml
from pynvml import *
nvmlInit()
handle = nvmlDeviceGetHandleByIndex(0) # 0番目のGPU
device_name = nvmlDeviceGetName(handle)
cc_major = nvmlDeviceGetCudaComputeCapability(handle)[0]
cc_minor = nvmlDeviceGetCudaComputeCapability(handle)[1]
print(f"GPU: {device_name.decode('utf-8')}")
print(f"Compute Capability: {cc_major}.{cc_minor}")
nvmlShutdown()

コード例・コマンド例:計算能力に基づいた具体的な対応

計算能力が分かった後の具体的なアクション例を示します。

ケース1: PyTorchで「Unsupported gpu architecture」エラーが出る場合
計算能力が8.6 (Ampereアーキテクチャの一部GPU) で、ソースからPyTorchをビルドする必要がある場合のコンパイルオプション例です。

# PyTorchソースビルド時の環境変数設定例 (Linux)
export TORCH_CUDA_ARCH_LIST="8.6" # 自分のGPUの計算能力を指定
python setup.py install
# 複数の計算能力に対応させる場合 (配布用)
export TORCH_CUDA_ARCH_LIST="7.5;8.0;8.6"

ケース2: nvccでCUDAカーネルをコンパイルする場合
`-arch=compute_XY` と `-code=sm_XY` のオプションを適切に設定します。`XY`は計算能力です。

# 計算能力8.6をターゲットにコンパイル
nvcc -arch=compute_86 -code=sm_86 my_kernel.cu -o my_kernel
# 複数のアーキテクチャ向けに互換性のあるバイナリを作成(一般的な方法)
nvcc -gencode arch=compute_80,code=sm_80 
     -gencode arch=compute_86,code=sm_86 
     my_kernel.cu -o my_kernel

まとめ・補足情報

GPUの計算能力(Compute Capability)は、CUDAを利用するAI開発の基盤となる情報です。環境構築時の最初のステップとして、以下のフローで確認することを強くお勧めします。

  1. まずnvidia-smiでGPUモデル名を確認。
  2. CUDA Toolkitが入っていれば、deviceQueryサンプルを実行して計算能力を直接取得(最も確実)。
  3. AI環境が動いていれば、PyTorch/TensorFlowのスクリプトで確認も可能。

重要な補足:

  • 「CUDA Version」と「Compute Capability」は全く別物です。`nvidia-smi`で表示される「CUDA Version」はドライバがサポートする最大のCUDA Toolkitバージョンであり、GPUのハードウェア能力である計算能力とは混同しないでください。
  • クラウドインスタンス(AWS EC2 G4/G5, Google Cloud A2/A3, Azure NC/NDシリーズなど)を使用する場合も、提供されるGPUの計算能力を必ず仕様書で確認してください。例えば、T4は7.5、A10は8.6、A100は8.0です。
  • 計算能力は、フレームワークのパフォーマンスにも直結します。自身のGPUに最適化されたバイナリを使用することで、学習・推論速度が向上する可能性があります。

本記事で紹介した方法で自身のGPUの計算能力を把握し、適切なCUDA Toolkitバージョン、深層学習フレームワークのバージョン(またはビルドオプション)を選択することで、無用な環境構築のトラブルに時間を奪われることなく、本質的なAI開発に集中できるようになるでしょう。

この記事は役に立ちましたか?