NVIDIA、CUDAにネイティブPythonサポートを追加
(thenewstack.io)- CUDAがC/C++中心のエコシステムから離れ、Python開発者がNVIDIA GPUコンピューティングをより直接扱える方向へ拡張された
- 新サポートは単なるバインディングではなく、CUDAツールキット全体にPythonインターフェースとスクリプティングの流れを統合しようとする試みである
- CUDA Pythonスタックには、基本バインディング、ランタイムコンパイラ、cuPyNumeric、CUDA Core、NVMath Python、プロファイラやコード解析ツールまで含まれる
- NVIDIAはJITコンパイルと既存のC++コード連携を活用し、Pythonの生産性を高めつつ性能差を小さく保とうとしている
- CuTileインターフェースは、Python開発者がスレッドよりも配列やタイル単位でGPU処理を理解し、デバッグしやすくするモデルである
CUDAにやってきたネイティブPython
- PythonはGitHubの2024年オープンソース調査によると、JavaScriptを抜いて世界で最も人気のあるプログラミング言語となった
- NVIDIAのCUDAソフトウェアツールキットは長年ネイティブPythonサポートを欠いていたが、GTCでネイティブサポートと全面的な統合が発表された
- 開発者はPythonでNVIDIA GPU上で実行されるアルゴリズム計算を直接記述できる
- CUDAアーキテクトのStephen Jonesは、CUDAスタックに「accelerated Python」を第一級サポートとして持ち込むために取り組んできたと述べた
- 新しい方向性はCをPython構文に移すことではなく、Python開発者にとって自然なCUDA Pythonを作ることにある
Python開発者基盤への拡大
- CUDAは従来、C++またはFortranの知識が必要で、一部のPythonツールは存在したもののネイティブサポートではなかった
- ネイティブPythonサポートは、CUDA開発ツールを数百万のPython開発者に開放する
- The Futurum Groupによると、CUDAユーザーは2020年の200万人から2023年には400万人へ増加した
- Pythonは急成長している言語であり、NVIDIAはインドやブラジルのような新興国のPython開発者にもアクセスできるようになる
- NVIDIA GPUのかなりの数は米国と欧州にあるが、インドの通信・インフラ企業が今後運用される大規模GPU導入を構築中である
- NVIDIAはプログラマー獲得に力を入れており、RustやJuliaを含め、より多くのプログラミング言語をサポートしようとしている
Pythonic CUDAスタックの構成
- CUDAにはライブラリ、SDK、コンパイラ、ホストランタイム、ツール、事前パッケージ化されたソフトウェアやアルゴリズムが含まれる
- NVIDIAはPythonic CUDA stack全体にコンポーネントを追加した
- 中核目標は、Pythonを離れることなくGPUアクセラレーションを提供することにある
- Jonesによると、CUDA Pythonはカーネル提供だけで終わってはならず、スタック全体とシームレスな実行フローが必要である
- カーネルを書いてPyTorchに入れられる必要がある
- Pythonicライブラリや他のコンポーネントも呼び出せる必要がある
- コンパイラ層は事実上JITコンパイル中心で構成されており、GPUスタックの依存関係ツリーを大幅に減らす
- 層間の相互運用性は、Pythonをエンドツーエンドで使う生産性向上に重要である
CUDA Core、cuPyNumeric、NVMath Python
- NVIDIAは初期段階で、ランタイムコンパイラを含む基本PythonバインディングとPythonライブラリを構築した
- cuPyNumericは、Pythonで広く使われる計算ライブラリNumPyのドロップイン代替である
- import文を1つ変えるだけで、NumPyコードがCPUではなくGPU上で実行される
- 過去1年間でNVIDIAはCUDA Coreを作り、JonesはこれをCUDAランタイムを自然でネイティブなPythonとして再構想した結果だと見ている
- CUDA CoreはPythonの実行フローに従い、完全にプロセス内で動作し、JITコンパイルに大きく依存する
- NVIDIAは、ホスト側とデバイス側のライブラリ呼び出しに統合インターフェースを提供するNVMath Pythonも作った
- Jonesによると、ライブラリ呼び出しを融合できる能力は大きな性能改善につながる
- Pythonコードから高速化されたC++ライブラリへ直接アクセスできるライブラリも構築された
- Pythonで再実装するのではなく、既存のきめ細かく最適化されたC++コードを接続する
- Jonesは、この方法なら性能差は無視できるほど小さくなると見ている
- プロファイラとコードアナライザ向けのツールも追加された
CuTileプログラミングモデル
- Pythonはハードウェアの詳細をあまり意識せずにコーディングしやすくし、NVIDIAはGPU実行向けのより高水準な抽象化に合わせたコーディング層を追加している
- 新しいプログラミングモデルであるCuTileインターフェースは、まずPythonic CUDA向けに開発され、その後C++ CUDA拡張が登場する予定である
- CuTileは、Python開発者がC++開発者のようにスレッドではなく配列を中心に考える点に合わせて設計されている
- Pythonコードを魔法のようにGPUアクセラレーション向けへ書き出せるわけではない
- CUDAは一般に問題を数千の小さなブロックに分割する
- ブロックはさらに小さなタイルに分割される
- タイル内では数千のスレッドが単一要素を処理する
- スレッドが集まって1つの演算を実行する
- GPUの大きな計算能力は、スレッドレベルで単一要素まで並列処理できることから生まれる
- NVIDIAは、GPU実行は必ずしもスレッドレベルまで下りる必要はなく、タイルレベルの中間段階でも処理できると考えている
- CuTileは、配列をGPUへより粗い粒度で効率的にマッピングし、コードの理解とデバッグを容易にする
- Jonesによると、この方法は本質的に同じ性能につながる
- タイルのデータはベクトル、テンソル、配列で構成できる
- コンパイラは配列全体の演算をスレッドブロックからGPUへマッピングする作業をよりうまく行え、JonesはコンパイラがGPU実行の詳細を深く理解しているため、自分よりもうまくやることが多いと見ている
- PythonはC++と違って設計上きめ細かい言語ではなく、JonesはOpenAIのTritonをPythonプログラムに自然に適合する例として挙げている
2件のコメント
Cupy や pytorch のような既存の Cuda ラッパーより、さらに速いんでしょうか。Cupy や torch の利点は、numpy と API がほぼまったく同じなので、numpy で書いていたテストコードをあまり手間をかけずに移せたことでしたが、これはどうなのか使ってみないとですね。
最初の速度は本当ですか? あまりにも遅いのですが…