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

問題の概要:CUDA対応GPUの計算能力(Compute Capability)がわからない

CUDA(Compute Unified Device Architecture)を利用したAI開発、特に深層学習のモデルトレーニングや推論を行う際、環境構築の初期段階で多くの開発者が直面する課題があります。それは、自身のGPUの計算能力(Compute Capability)がわからないという問題です。

この情報が不明なままだと、以下のような具体的なエラーや不具合に遭遇する可能性が高まります:

  • CUDAサンプルコードのコンパイルエラー: nvccでコードをコンパイルする際、アーキテクチャ指定が合わないとエラーが発生します。
    nvcc fatal   : Unsupported gpu architecture 'compute_90'
  • PyTorch/TensorFlowのインストール・実行エラー: フレームワークがビルドされたCUDAバージョンとGPUの計算能力が互換性がない場合、以下のようなエラーが表示されたり、GPUが認識されないことがあります。
    RuntimeError: CUDA error: no kernel image is available for execution on the device
    This TensorFlow binary is not optimized for your GPU...
  • cuDNNや他のCUDAライブラリとの互換性問題: ライブラリのバージョンがGPUのアーキテクチャをサポートしていない。

計算能力は、GPUハードウェアがサポートする機能セット(FP16演算、Tensor Coresの有無など)を表すバージョン番号(例: 7.5, 8.6, 9.0)です。この値に基づいて、利用可能なCUDA機能や最適化されたバイナリが決定されるため、環境構築の最初のステップとして正確に確認することが極めて重要です。

原因の解説:なぜ計算能力の確認が必要なのか

計算能力の確認が必要な根本的な理由は、CUDAの「バイナリ互換性」と「ソース互換性」のモデルにあります。

NVIDIAは、異なる計算能力のGPU間での互換性を以下のように規定しています:

  1. バイナリ互換性はない: ある計算能力(例: sm_75)向けにコンパイルされた実行可能コード(カーネル)は、それより低い計算能力(例: sm_70)のGPUでは動作しません。逆に、高いGPUで低いアーキテクチャ向けコードは動作する場合がありますが、性能を最大限引き出せません。
  2. ソース互換性は高い: CUDA C++で書かれたソースコードは、ほとんどの場合、異なる計算能力のGPU用に再コンパイルすることで動作させられます。

つまり、PyTorchやTensorFlowのようなフレームワークをpipでインストールする場合、配布されているプリビルド済みのホイール(wheel)ファイルは特定の計算能力範囲のGPU向けにのみビルドされています。もしあなたのGPUの計算能力がその範囲外であれば、上記の「no kernel image」エラーが発生するのです。

また、CUDA Toolkit自体やnvccコンパイラも、デフォルトでは最新または広範なアーキテクチャをサポートしていない場合があり、コンパイル時に明示的なアーキテクチャ指定(-arch=sm_XX)が必要になります。

解決方法:計算能力を確認する4つの実用的な方法

ここからは、実際にご自身のGPUの計算能力を確認するための具体的な方法をステップバイステップで解説します。複数の方法を紹介するので、ご自身の環境に合わせてお試しください。

方法1: NVIDIA公式ドキュメントで確認(最も確実)

GPUのモデル名が分かっている場合、NVIDIAの公式リストを参照するのが最も確実です。

手順:

  1. 使用しているGPUの正確なモデル名を確認します(例: GeForce RTX 3080, Tesla V100, A100)。
  2. NVIDIAの公式ドキュメント「CUDA GPUs」ページにアクセスします。
  3. リストから該当するGPUを探し、「Compute Capability」の列の値を確認します。

この方法は、ドライバーやツールがインストールされていない新しい環境や、リモートサーバーでモデル名だけが分かっている場合に有効です。

方法2: nvidia-smiコマンドと追加ツールで確認(標準的)

NVIDIAドライバーがインストールされている環境では、nvidia-smiコマンドでGPUモデルを確認し、それに付随するnvidia-cuda-mps-controlツールで詳細を取得できます。

手順:

  1. ターミナル(コマンドプロンプト)を開きます。
  2. 以下のコマンドを実行してGPUモデルを確認します。
    nvidia-smi -L

    出力例:

    GPU 0: NVIDIA GeForce RTX 4090 (UUID: GPU-xxxx...)
  3. 次に、以下のコマンドを実行してより詳細な情報を取得します。このコマンドの出力に計算能力が含まれている場合があります。
    nvidia-smi -q

    大量の出力が表示されるので、grep(Linux/macOS)またはfindstr(Windows)で「Product Name」や「CUDA Version」などの情報をフィルタリングすると良いでしょう。

方法3: deviceQueryサンプルプログラムで確認(CUDA Toolkit利用)

CUDA Toolkitがインストールされている環境では、付属のサンプルプログラムdeviceQueryを実行するのが最も正確で詳細な情報を得られる方法です。

手順:

  1. CUDA Toolkitがインストールされていることを確認します。
  2. サンプルプログラムのソースコードがあるディレクトリに移動します。典型的なパスは以下の通りです:
    • Windows: C:ProgramDataNVIDIA CorporationCUDA SamplesvXX.Xbinwin64Release (事前にビルド済みの実行ファイルがある場合)
    • Linux: /usr/local/cuda/samples/1_Utilities/deviceQuery (ソースディレクトリ)
  3. Linuxなどソースからビルドが必要な場合は、サンプルディレクトリでmakeを実行します。
  4. deviceQuery実行ファイルを実行します。
    ./deviceQuery
  5. 出力の中から、以下のような行を探します。ここに計算能力のメジャーバージョンとマイナーバージョンが表示されます。
    CUDA Capability Major/Minor version number:    8.6

    この「8.6」が計算能力です。CUDAの文脈では、これはsm_86compute_86と表記されます。

方法4: Pythonスクリプトでプログラム的に確認(開発者向け)

Python環境が構築されており、PyTorchやTensorFlowを利用予定の開発者には、以下のスクリプトを実行する方法が便利です。これにより、実際にフレームワークから見たGPUの情報を確認できます。

PyTorchを利用する場合:

import torch

if torch.cuda.is_available():
    device_count = torch.cuda.device_count()
    print(f"利用可能なCUDAデバイス数: {device_count}")
    
    for i in range(device_count):
        print(f"n--- デバイス {i} ---")
        prop = torch.cuda.get_device_properties(i)
        print(f"  名前: {prop.name}")
        print(f"  計算能力: {prop.major}.{prop.minor}")
        print(f"  合計メモリ: {prop.total_memory / 1e9:.2f} GB")
else:
    print("CUDAは利用できません。")

TensorFlow 2.xを利用する場合:

import tensorflow as tf

print("TensorFlow バージョン:", tf.__version__)
print("CUDA ビルド設定:", tf.sysconfig.get_build_info()["cuda_version"])
print("cuDNN ビルド設定:", tf.sysconfig.get_build_info()["cudnn_version"])

gpus = tf.config.list_physical_devices('GPU')
if gpus:
    print(f"n利用可能なGPU数: {len(gpus)}")
    for gpu in gpus:
        details = tf.config.experimental.get_device_details(gpu)
        if details: # get_device_detailsは環境によってはNoneを返す場合あり
            # 計算能力は'compute_capability'キーにある場合があります
            print(f"  デバイス名: {gpu.name}")
            print(f"  詳細: {details}")
else:
    print("GPUは認識されていません。")

コード例・コマンド例:計算能力を活用する実際の場面

計算能力が分かったら、それを実際の開発でどのように活用するのか、具体例を見てみましょう。

例1: CUDAコードのコンパイル時
nvccでCUDAカーネルをコンパイルする際、計算能力に応じたアーキテクチャを指定します。RTX 3080(計算能力8.6)の場合:

nvcc -arch=sm_86 -o my_kernel my_kernel.cu

複数のアーキテクチャ向けに互換性を持たせてビルドする(Fat Binary)には:

nvcc -arch=sm_70 -code=sm_70,sm_86 -o my_kernel my_kernel.cu

例2: PyTorchのカスタム拡張をビルドする場合
PyTorchのC++/CUDA拡張をsetup.pyでビルドする際、CUDAExtensionに計算能力を指定します。

from setuptools import setup
from torch.utils.cpp_extension import CUDAExtension, BuildExtension

setup(
    name='my_extension',
    ext_modules=[
        CUDAExtension('my_extension', [
            'my_extension.cpp',
            'my_extension_kernel.cu',
        ],
        extra_compile_args={'cxx': [],
                            'nvcc': ['-arch=sm_86']}) # ここで指定
    ],
    cmdclass={
        'build_ext': BuildExtension
    }
)

まとめ・補足情報

GPUの計算能力(Compute Capability)は、CUDAを利用したAI開発の基盤となる重要な情報です。これを確認せずに環境構築を進めると、後々で互換性エラーに悩まされることになります。本記事で紹介した方法を活用し、最初に正確な情報を把握してください。

主要なGPUと計算能力の対応表(一部抜粋):

  • GeForce GTX 10系列 (Pascal): GTX 1080 Ti (6.1), GTX 1070 (6.1)
  • GeForce RTX 20系列 (Turing): RTX 2080 Ti (7.5), RTX 2070 (7.5)
  • GeForce RTX 30系列 (Ampere): RTX 3090 (8.6), RTX 3080 (8.6), RTX 3060 (8.6)
  • GeForce RTX 40系列 (Ada Lovelace): RTX 4090 (8.9), RTX 4080 (8.9)
  • Tesla/データセンター系: V100 (7.0), A100 (8.0), H100 (9.0)

注意点:

  1. 計算能力はハードウェア固有の値であり、ドライバーやCUDA Toolkitのバージョンをアップデートしても変化しません。
  2. 高い計算能力のGPUは、低い計算能力向けにビルドされたほとんどのソフトウェアを実行できます(後方互換性)。しかし、そのGPUの新機能(例: Tensor Cores)を活用するには、その計算能力をターゲットにしたビルドが必要です。
  3. クラウドサービス(AWS EC2, Google Colab等)を利用する場合も、インスタンスタイプからGPUモデルを特定し、計算能力を確認する習慣をつけましょう。

最初の一歩である計算能力の確認を確実に行うことで、その後のCUDA環境構築、フレームワークの選択、パフォーマンスチューニングがスムーズに進みます。本記事がAI開発を始める皆様の一助となれば幸いです。

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