STACK / GPU · KERNEL · MEMORY
CUDAGPU COMPUTING
GPUを、計算の仕事場として使うための共通言語
CUDAは、NVIDIA GPUで汎用計算を行うためのプラットフォームとプログラミングモデルです。機械学習では、PyTorchなどのフレームワークがCUDAを経由して、大量の行列計算をGPUへ渡します。
データをデバイスへ移し、並列計算を実行して結果を戻します。
CONTENTSこの記事の目次+
01 — POSITION
CUDAとは
何か
CUDAは「GPUそのもの」でも「機械学習ライブラリ」だけでもありません。CPUをホスト(Host)、GPUをデバイス(Device)と位置づけ、デバイスへデータを転送し、GPU上で動くカーネル(Kernel)を多数のスレッドで並列実行させて結果を受け取る仕組みの総称です。CUDA Toolkitにはコンパイラ、高速化ライブラリ、デバッガなどが含まれています。
02 — COMPUTE PIPELINE
データが計算結果へ
変わるまで
CPUとGPUの役割を分け、どこでデータが動くのかを順番に見ます。
ホスト(CPU)からデバイス(GPU)へデータを転送し、数千スレッドで並列カーネルを実行して結果を回収します。
CPUから仕事を出す
アプリケーションはまずCPUで始まり、計算に使うデータと処理を準備します。
→データをGPUへ移す
ホストメモリ上のテンソルや配列をデバイスメモリ(GPUメモリ)へコピーします。
→Threadを並列実行
GPU上のカーネルをブロックとスレッドへ分割し、同じ計算を大量の要素に対して並列に適用します。
→結果を次の処理へ
GPU上のメモリにある計算結果を次の処理で再利用するか、必要なときだけCPU側へ転送して戻します。
小さなデータでは移動の時間が勝つこともあるため、計算量と転送量を一緒に見積もります。
03 — LAYER MAP
CUDAとPyTorchは、どこでつながる?
PyTorchで記述したテンソル演算は、実行先のバックエンドへ振り分けられます。NVIDIA GPUであれば、その下でCUDA対応のカーネルや高速化ライブラリが計算を担当します。
モデルのコード
Pythonでテンソル、レイヤー、損失関数を組み合わせてモデルを記述します。
→Tensor演算へ分解
行列積(matmul)や畳み込みなど、実行すべき演算の並びへ変換します。
→GPU用Kernelを選ぶ
CUDA、cuBLAS、cuDNNなどの最適な実装へ処理をディスパッチします。
→並列に計算する
GPUのスレッドとメモリを使って並列計算し、演算結果を次のレイヤーへ渡します。
PyTorchを使えば、CUDAのスレッド配置などを細かく記述しなくても、テンソルとデバイスを指定するだけでGPUによる高速計算を利用できます。
ハードウェアへの入口
NVIDIA GPUの計算モデル、メモリ管理、ストリーム、カーネル起動などを扱う基盤です。
よく使う計算を高速化
行列計算やディープラーニング向けの処理を、専門のCUDAライブラリ(cuBLASやcuDNNなど)が最適化します。
上位の道具から利用
開発者はPythonのTensor APIを中心に記述し、実際の演算処理をCUDAバックエンドへ任せられます。
04 — QUICK START
まずGPUが見えるか確認する
インストールを増やす前に、ドライバ、Toolkit、PyTorchのどの層まで見えているかを分けて確認します。
# NVIDIA DriverがGPUを認識しているか
nvidia-smi
# CUDA Toolkitのコンパイラが入っているか
nvcc --version
# PyTorchからCUDAが利用できるか
python -c "import torch; print(torch.cuda.is_available())"01DRIVER nvidia-smiでGPU名、ドライババージョン、メモリ使用量を確認
02TOOLKIT nvccはCUDA C/C++コードをコンパイルするToolkit付属のコマンド
03PYTORCH torch.cuda.is_available()でPyTorchからCUDAが利用可能かを判定
05 — CHOOSE YOUR DEVICE
手元の環境に
合わせる
「CUDAがないと機械学習できない」わけではありません。使えるバックエンドを確認してから始めます。
CUDAを使う標準ルート
対応するNVIDIA GPUとドライバを用意し、PyTorchは公式の「Start Locally」からOS・Python・CUDAの適切な組み合わせを選択して導入します。まずnvidia-smiとtorch.cuda.is_available()で認識を確認します。
CUDAではなくMPS
Apple Silicon搭載MacにはNVIDIAのCUDA環境はありません。代わりにPyTorchのMPS(Metal Performance Shaders)バックエンドを利用し、torch.backends.mps.is_available()でGPUアクセラレーションの利用可否を確認します。
CPUやROCmから始める
GPUがなくてもCPUだけでPyTorchを動かすことができます。また、Linux環境でAMD製GPUを使う場合は、PyTorch公式の対応表からROCm用のビルドを選択し、CUDA版と混同しないように注意します。
06 — WATCH OUT
最初につまずきやすい
3つの点
GPUが見えること、速くなること、安定して動くことは別々に確認します。
CUDAはGPUそのものではない
GPUはハードウェア、ドライバはOSから制御するためのソフトウェア、Toolkitは開発環境、PyTorchは上位のフレームワークです。どの層で問題が起きているかを切り分けることがトラブルシューティングの鍵になります。
Toolkitの版番号だけを合わせない
PyTorchの配布バイナリ、NVIDIAドライバ、GPUアーキテクチャの対応状況がすべて揃って初めて動作します。インストールコマンドのCUDAバージョン番号だけで判断せず、公式の対応表と手元の実機確認結果を照らし合わせます。
GPUへ運ぶ時間も計算量に入れる
小さな配列を何度もCPUとGPUの間で往復させると、並列計算による高速化がデータ転送のオーバーヘッドで打ち消されてしまいます。データとモデルをあらかじめ同じデバイス上に配置し、まとまった単位で計算するのが基本です。
IN ONE SENTENCE
CUDAとは?
NVIDIA GPUへデータを転送し、カーネルを大量のスレッドで並列実行するための計算プラットフォームおよびプログラミングモデル。
SOURCES / OFFICIAL DOCS
