PyTorchにおけるCUDAとGPU情報取得:`torch.cuda.get_device_properties`関数の使い方とサンプルコード


CUDAは、NVIDIA社が開発したGPU向けの並列計算プラットフォームです。GPUは、CPUよりも遥かに高速なメモリアクセスと演算処理能力を持ち、深層学習のような計算量が多いタスクに適しています。

PyTorchにおけるCUDA

PyTorchは、CUDAに対応しており、GPU上で計算を実行することができます。これにより、CPUのみで処理する場合よりも大幅に処理速度を向上させることができます。

torch.cuda.get_device_properties関数

torch.cuda.get_device_properties関数は、指定されたCUDAデバイスのプロパティを取得します。この関数は、以下の情報を返します。

  • メモリ帯域幅
    デバイスのメモリ帯域幅 (GB/秒単位)
  • コンピュート能力
    デバイスのコンピュート能力
  • マルチプロセッサ数
    デバイスのマルチプロセッサ数
  • 合計グローバルメモリ
    デバイスのグローバルメモリの総量 (GB単位)
  • CUDA Capability
    デバイスのCUDA機能のメジャーバージョンとマイナーバージョン
  • 名前
    デバイスの名前

import torch

device = torch.device("cuda:0")  # デバイスを指定

properties = torch.cuda.get_device_properties(device)

print(f"名前: {properties.name}")
print(f"CUDA Capability: {properties.major}, {properties.minor}")
print(f"合計グローバルメモリ: {properties.total_memory / 1024 / 1024 / 1024} GB")
print(f"マルチプロセッサ数: {properties.multiprocessor_count}")
print(f"コンピュート能力: {properties.compute_capability}")
print(f"メモリ帯域幅: {properties.memory_bandwidth / 1024 / 1024 / 1024} GB/秒")

このコードを実行すると、使用可能なCUDAデバイスのプロパティが表示されます。

  • 複数のCUDAデバイスがある場合は、torch.device("cuda:N") (Nはデバイス番号)を使用して、特定のデバイスを指定できます。
  • torch.device("cuda")を使用して、デフォルトのCUDAデバイスを取得できます。
  • torch.cuda.is_available()関数を使用して、CUDAが利用可能かどうかを確認できます。


import torch

# デバイスを指定
device = torch.device("cuda:0")

# デバイスプロパティを取得
properties = torch.cuda.get_device_properties(device)

# プロパティを表示
print(f"名前: {properties.name}")
print(f"CUDA Capability: {properties.major}, {properties.minor}")
print(f"合計グローバルメモリ: {properties.total_memory / 1024 / 1024 / 1024} GB")
print(f"マルチプロセッサ数: {properties.multiprocessor_count}")
print(f"コンピュート能力: {properties.compute_capability}")
print(f"メモリ帯域幅: {properties.memory_bandwidth / 1024 / 1024 / 1024} GB/秒")

# CPUとGPUでテンソルを作成し、演算を実行
x = torch.randn(1000, 1000, device=device)
y = torch.randn(1000, 1000, device=device)

z = x + y

# 結果をCPUへ転送して確認
z = z.to('cpu')
print(z)

説明

  1. torch.device("cuda:0")を使用して、デフォルトのCUDAデバイスを指定します。
  2. torch.cuda.get_device_properties(device)を使用して、デバイスのプロパティを取得します。
  3. 取得したプロパティをコンソールに表示します。
  4. torch.randnを使用して、ランダムな値を持つテンソルを2つ作成します。
  5. デバイスを指定して、テンソルをGPUに配置します。
  6. 2つのテンソルを加算します。
  7. to('cpu')を使用して、結果をCPUに転送します。
  8. 転送された結果をコンソールに表示します。

このコードを実行すると、使用可能なCUDAデバイスのプロパティと、CPUとGPUでテンソルを作成して演算を実行する様子を確認できます。

  • より複雑な演算を実行するには、PyTorchの他の関数を使用できます。
  • 複数のCUDAデバイスがある場合は、torch.device("cuda:N") (Nはデバイス番号)を使用して、特定のデバイスを指定できます。
  • このコードは、CUDAが利用可能であることを前提としています。torch.cuda.is_available()を使用して、CUDAが利用可能かどうかを確認してください。


以下に、torch.cuda.get_device_properties の代替手段となるいくつかの方法をご紹介します。

環境変数を使用する

CUDAデバイスに関する情報は、以下の環境変数に格納されています。

  • CUDA_DEVICE_ORDER
    CUDAデバイスを列挙する順序 (PCIバス番号 or 相対的なデバイスID)
  • CUDA_VISIBLE_DEVICES
    使用可能なCUDAデバイスのIDをカンマ区切りで列挙した文字列

これらの環境変数の値を直接取得することで、デバイスに関する基本的な情報を得ることができます。

import os

# 使用可能なCUDAデバイスのIDを取得
cuda_visible_devices = os.environ.get('CUDA_VISIBLE_DEVICES')
print(f"使用可能なCUDAデバイス: {cuda_visible_devices}")

# デフォルトのCUDAデバイスのIDを取得
cuda_device_order = os.environ.get('CUDA_DEVICE_ORDER')
print(f"デフォルトのCUDAデバイス順序: {cuda_device_order}")

nvidia-smi コマンドを使用する

nvidia-smi コマンドは、NVIDIA製GPUに関する詳細な情報を表示するツールです。このコマンドを使用することで、デバイスのプロパティだけでなく、現在の使用状況や温度なども確認できます。

nvidia-smi

PyTorchの他の関数を使用する

以下の関数は、CUDAデバイスに関する情報を取得するために使用できます。

  • torch.cuda.set_device(device): デフォルトのCUDAデバイスを設定します。
  • torch.cuda.current_device(): 現在のデフォルトCUDAデバイスを取得します。
  • torch.cuda.device_count(): 使用可能なCUDAデバイスの数を取得します。
  • torch.cuda.is_available(): CUDAが利用可能かどうかを確認します。

これらの関数を組み合わせることで、状況に応じて必要な情報を得ることができます。

import torch

# CUDAが利用可能かどうかを確認
if torch.cuda.is_available():
    # 使用可能なCUDAデバイスの数を取得
    device_count = torch.cuda.device_count()
    print(f"使用可能なCUDAデバイスの数: {device_count}")

    # 現在のデフォルトCUDAデバイスを取得
    current_device = torch.cuda.current_device()
    print(f"現在のデフォルトCUDAデバイス: {current_device}")

    # 特定のCUDAデバイスを設定
    device = torch.device("cuda:1")
    torch.cuda.set_device(device)

    # 設定されたデバイスのプロパティを取得
    properties = torch.cuda.get_device_properties(device)
    print(f"名前: {properties.name}")
    print(f"CUDA Capability: {properties.major}, {properties.minor}")
    print(f"合計グローバルメモリ: {properties.total_memory / 1024 / 1024 / 1024} GB")
else:
    print("CUDAが利用可能ではありません。")