Re Reference AI

インフラ

CUDA

Compute Unified Device Architecture

NVIDIA製GPU上で汎用並列計算を行うための並列計算プラットフォーム・プログラミングモデル

並列計算NVIDIA

概要

CUDA(Compute Unified Device Architecture)は、NVIDIAが提供するGPU向けの並列計算プラットフォーム兼プログラミングモデル。 C/C++に近い記法でGPU上の数千コアを直接制御するプログラム(カーネル)を書けるようにし、グラフィックス処理に限らない汎用計算(GPGPU)をGPU上で実行できるようにした。 PyTorchやTensorFlowなど主要な機械学習フレームワークは内部でCUDAを介してGPU上の行列演算を実行しており、深層学習の学習・推論を支える基盤ソフトウェアとなっている。

背景

GPUは元々グラフィックスのレンダリング専用に設計されており、グラフィックスAPI経由でしか演算資源を利用できなかった。 NVIDIAはGPUの持つ大規模並列演算能力をグラフィックス以外の汎用計算にも活用できるようにするため、GPU上で直接動作する並列プログラムを書くための開発環境としてCUDAを開発した。

歴史

2006年: NVIDIAがCUDAを発表し、GPU上で汎用計算を行うプログラミングモデルを提供開始。 2009年以降: cuDNNなど深層学習向けライブラリが整備され、機械学習フレームワークのGPU対応が加速。 2012年: AlexNetの学習にCUDA対応GPUが用いられ、深層学習ブームの技術的基盤の一つとなる。 以降、主要な機械学習フレームワークが標準でCUDAバックエンドをサポートするようになった。

アーキテクチャ

CPU(ホスト)側で実行を制御しつつ、GPU(デバイス)側に大量の軽量スレッドからなる並列処理(カーネル)を投入するホスト・デバイスモデルを採る。 スレッドはグリッド・ブロック・スレッドという階層構造で管理され、同一の命令を大量のデータに適用するSIMT方式でGPUの演算コアを活用する。

ワークフロー

ホスト(CPU)からデバイス(GPU)へデータを転送 → GPU上でカーネル(並列処理)を実行 → 結果をホストに転送、またはGPUメモリ上で後続処理に利用。 機械学習フレームワークではこの一連の流れがライブラリ内部に隠蔽され、開発者は`.to("cuda")`のような高レベルAPIで利用する。

コード例

PyTorchでのCUDAデバイス指定

import torch

if torch.cuda.is_available():
    device = torch.device("cuda")
    print(torch.cuda.get_device_name(0))

利点

  • NVIDIA GPUの並列演算能力を汎用計算に活用でき、機械学習・科学技術計算を大幅に高速化する
  • cuDNNやcuBLASなど深層学習向けに最適化されたライブラリ群が整備されている
  • 主要な機械学習フレームワークが標準対応しており、エコシステムが成熟している

欠点

  • NVIDIA製GPUに依存しており、他社製GPUでは利用できない(ベンダーロックインの一因)
  • GPUドライバやCUDAバージョンとフレームワークのバージョン間の互換性管理が煩雑になりやすい

比較

  • GPUGPUがハードウェア基盤であるのに対し、CUDAはそのGPU上で汎用計算を行うためのソフトウェアプラットフォーム
  • PyTorchPyTorchはCUDAをバックエンドとして呼び出すことで、GPU上のテンソル演算を高レベルAPIから実行できる

関連用語

GPU深層学習ニューラルネットワークPyTorch

参考文献