問題の概要:CUDA環境構築時の「Compute Capability」不一致エラー
CUDAやcuDNN、PyTorch、TensorFlowなどのGPUアクセラレーションを利用するAI開発環境を構築する際、特にソースからビルドする場合や、特定バージョンのライブラリをインストールする際に、以下のようなエラーに遭遇することがあります。
# PyTorchのビルド時や実行時に発生する例
RuntimeError: CUDA error: no kernel image is available for execution on the device
# または
The current PyTorch install supports CUDA capabilities sm_37 sm_50 sm_60 sm_70 sm_75 sm_80 sm_86 compute_86.
If you want to use the NVIDIA GeForce RTX 3050 Ti Laptop GPU with CUDA, please check that PyTorch supports its compute capability (8.6).
また、TensorFlowをインストールしようとした際には、次のようなメッセージが表示されることもあります。
# pip install tensorflow 時のエラー例(古いGPUの場合)
tensorflow.python.framework.errors_impl.InvalidArgumentError: Cannot assign a device for operation...
...no supported kernel for GPU devices is available
...registered devices... device: GPU, pci bus id: 0000:01:00.0, compute capability: 3.5
これらのエラーの核心は、お使いのGPUの計算能力(Compute Capability)と、インストールしようとしているCUDAライブラリやフレームワークがサポートする計算能力の範囲が一致していないことにあります。Compute Capabilityは、NVIDIA GPUのハードウェアアーキテクチャの世代と機能を表すバージョン番号(例:sm_86, compute_86)です。この番号を事前に確認することで、互換性のあるソフトウェアを選択し、環境構築の失敗を未然に防ぐことができます。
原因の解説:なぜCompute Capabilityが重要なのか?
Compute Capability(略してCC)は、GPUが持つ機能セット(サポートする命令、メモリ構成、コア数など)を定義するものです。NVIDIAは新しいGPUアーキテクチャ(例:Ampere, Ada Lovelace)をリリースするたびに、この番号を更新します。
CUDAを利用するソフトウェア、特にPyTorchやTensorFlowのようなディープラーニングフレームワークは、特定のCompute Capabilityを持つGPU向けに事前コンパイルされたバイナリ(カーネル)を同梱しています。もしあなたのGPUのCCが、フレームワークのバイナリがサポートする範囲外(例えば、フレームワークがsm_50以上をサポートしているのに、あなたのGPUがsm_35の場合)であれば、上記のエラーが発生し、GPUを利用できなくなります。
逆に、最新のGPU(CCが高い)を使っている場合でも、古いバージョンのフレームワークをインストールすると、そのフレームワークがあなたのGPUのCCをサポートしておらず、同様のエラーが発生する可能性があります。したがって、環境構築の最初のステップとして、自身のGPUのCompute Capabilityを正確に把握することが、時間を無駄にしないための重要な作業なのです。
解決方法:GPUのCompute Capabilityを確認する3つの実用的な方法
ここでは、Windows、Linux、macOS(NVIDIA GPU搭載機種に限る)で動作する、信頼性の高い確認方法を3つ紹介します。
方法1:NVIDIA公式ドキュメントでGPUモデルから調べる
最も基本的な方法です。ご自身のGPUモデル名が分かれば、NVIDIAの公式ウェブサイトで対応するCompute Capabilityを調べることができます。
手順:
- GPUモデル名を確認します(「NVIDIA GeForce RTX 4070」や「NVIDIA Tesla V100」など)。
- NVIDIAのCUDA対応GPU一覧ページにアクセスします。
- ページ内の表から該当するGPUを探し、「Compute Capability」の列を確認します。
この方法はインターネット接続が必要ですが、ドライバーをインストールしていない新しいマシンでも確認できる利点があります。
方法2:nvidia-smiコマンドとdeviceQueryサンプルを組み合わせる(推奨)
すでにNVIDIAドライバーがインストールされている環境では、最も確実で詳細な情報を得られる方法です。
手順:
- まず、ターミナル(WindowsならPowerShellまたはコマンドプロンプト)を開き、以下のコマンドでGPUの基本情報を確認します。
nvidia-smiこのコマンドでGPUモデル(例:GeForce RTX 3080)とドライバーバージョンが表示されます。
- 次に、CUDA Toolkitがインストールされている必要があります。インストール後、CUDAサンプルコードの中にある
deviceQueryを実行します。サンプルのパスは環境によって異なります。# Linux または WSL2 の一般的なパス例 /usr/local/cuda/samples/bin/x86_64/linux/release/deviceQuery # Windows の一般的なパス例(CUDA 11.xの場合) C:Program FilesNVIDIA GPU Computing ToolkitCUDAv11.xextrasdemo_suitedeviceQuery.exeもしサンプルがビルドされていない場合は、ソースからビルドします。
# Linuxの場合のビルド例(CUDAインストールパスに移動) cd /usr/local/cuda/samples/1_Utilities/deviceQuery sudo make ./deviceQuery deviceQueryを実行すると、詳細なGPU情報が表示されます。その中に以下のような行を探します。CUDA Capability Major/Minor version number: 8.6この例では、Compute Capabilityが8.6(メジャーバージョン8、マイナーバージョン6)であることを意味し、これはsm_86やcompute_86と表記されます。
方法3:Pythonスクリプトでプログラムから確認する
Python環境がセットアップされており、PyTorchやTensorFlowを今後使う予定がある場合に便利な方法です。これらのフレームワークが提供するユーティリティを使って確認できます。
PyTorchを使用する場合:
import torch
# GPUが利用可能か確認
if torch.cuda.is_available():
# デフォルトのCUDAデバイスを取得
device = torch.cuda.current_device()
# GPUの名前を取得
gpu_name = torch.cuda.get_device_name(device)
# Compute Capabilityを取得
compute_capability = torch.cuda.get_device_capability(device)
print(f"GPU名: {gpu_name}")
print(f"Compute Capability: {compute_capability}") # 例: (8, 6)
print(f"表記: sm_{compute_capability[0]}{compute_capability[1]}")
else:
print("CUDAが利用可能なGPUが見つかりません。")
NVIDIAが提供するpycudaやpynvmlを使用する場合:
# pynvmlをインストール: pip install pynvml
import pynvml
pynvml.nvmlInit()
handle = pynvml.nvmlDeviceGetHandleByIndex(0) # 0番目のGPU
cc_major = pynvml.nvmlDeviceGetCudaComputeCapability(handle)[0]
cc_minor = pynvml.nvmlDeviceGetCudaComputeCapability(handle)[1]
print(f"Compute Capability: {cc_major}.{cc_minor}")
pynvml.nvmlShutdown()
コード例・コマンド例:確認後の具体的なアクション
Compute Capabilityを確認した後、その情報を元に適切なソフトウェアを選択します。
例1: Compute Capabilityが3.5(sm_35)の古いGPU(例:GeForce GTX 750 Ti)の場合
最新のPyTorchやTensorFlowはサポートを終了している可能性が高いです。古いバージョンを指定してインストールする必要があります。
# PyTorchの旧バージョン(例:1.7.1)をインストールする例
pip install torch==1.7.1 torchvision==0.8.2 torchaudio==0.7.2
# または、公式サイトの過去のインストールコマンドを参照
例2: Compute Capabilityが8.6(sm_86)の比較的新しいGPU(例:GeForce RTX 3050 Ti)の場合
最新のフレームワークをインストールできますが、バージョンによってはまだサポートが追加されていない場合があるので、リリースノートを確認します。
# PyTorchのインストール(公式サイトの最新コマンドを推奨)
# 以下のコマンドは一例です。必ず公式サイトでご自身の環境に合ったコマンドを確認してください。
pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118
フレームワークをソースからビルドする場合は、ビルド設定でCompute Capabilityを指定します。
# PyTorchをソースビルドする際の設定例(setup.pyや環境変数)
export TORCH_CUDA_ARCH_LIST="8.6" # sm_86 を指定
# 複数指定する場合
export TORCH_CUDA_ARCH_LIST="7.5;8.0;8.6"
まとめ・補足情報
GPUのCompute Capabilityを確認することは、CUDAを利用するAI開発環境構築において、最初に実行すべき重要なトラブルシューティングステップです。確認を怠ると、互換性のないソフトウェアをインストールして時間を浪費したり、不可解なエラーに長時間悩まされたりする原因となります。
本記事で紹介した3つの方法の中では、方法2(nvidia-smiとdeviceQueryの組み合わせ)が、ドライバーとCUDA Toolkitがインストール済みの環境では最も確実です。Python環境が主戦場の方は、方法3(PyTorchやpynvmlを使う方法)を覚えておくと便利でしょう。
最後に重要な注意点として、ノートパソコンに搭載されるモバイルGPUは、同じモデル名でもデスクトップ版とCompute Capabilityが異なる場合があります(例:RTX 3060 MobileとRTX 3060)。また、クラウドサービス(AWS EC2, Google Colab, Azure NC/NDシリーズ等)で提供されるGPUのCCも、インスタンスタイプによって異なります。いずれの場合も、実際に動作している環境で本記事の方法を用いて確認することを強くお勧めします。この一手間が、その後のAI開発をスムーズに進めるための確かな基礎となります。