beehive-lab/TornadoVM
Write Java. Run on GPUs. Fast.
🌪️ TornadoVM – GPU上のJava
何であるか – TornadoVMは、純粋なJava カーネルを書けるオープンソースランタイムであり、GPU(NVIDIA、AMD、Intel、Apple Silicon)またはマルチコアCPU上で実行できます。実行時にJavaバイトコードをターゲットのネイティブGPU言語(CUDA PTX、OpenCL C、Apple Metal MSL)にJITコンパイルし、ホスト-デバイス間のデータ移動を自動で処理します。NVIDIAハードウェアでは、cuBLAS、cuFFT、cuDNNなどのCUDAライブラリスタックに直接アクセスでき、Tensor-Core mma.syncインプリントもJavaコードから利用可能です。
🎯 コアアイデア
| アイデア | 動作方法 |
|---|---|
| 一度書けば、どこでも実行 | CUDAスタイルのスレッドインデックス(ctx.globalIdx)を使用してJavaでカーネルを書くか、単に@Parallelでループをアノテートします。TornadoVMはTaskGraphを構築し、OpenCL、CUDA、Metal、CPUのいずれかのバックエンドにディスパッチできます。 |
| JITコンパイル | Javaバイトコード → Graal IR → バックエンド固有のソース(CUDA PTX / OpenCL C / MSL) → ランタイムコンパイラ(NVRTC、OpenCLドライバ、Metal) → 実際のデータサイズに最適化されたネイティブGPUバイナリ。 |
| ゼロJNIプラumbing | 手動で書いたネイティブラッパーは不要。ランタイムがネイティブコードを生成し、Javaプロセスに自動的にリンクします。 |
| ネイティブCUDAエコシステム統合 | 生成されたカーネルは、ライブラリ呼び出し(cublasSgemv、FFT、cuDNN演算、Tensor-Coreインプリント)とデバイスバッファとCUDAストリームを共有します。カスタムJavaカーネルとベンダー最適化ライブラリタスクを同じグラフ内で混在できます。 |
| CUDA Graphキャプチャ | グラフ全体(カーネル、ライブラリ呼び出し、転送)を一度記録し、cuGraphLaunchで単一コールで再実行可能。手書きCUDAと同等の起動オーバーヘッドを実現。 |
🚀 一般的な利用事例
| 分野 | 例のプロジェクト |
|---|---|
| 大規模言語モデル推論 | GPULlama3.javaはRTX 5090で約117トークン/秒の速度でLlama-3、Qwen-3、Mistralなどを純粋なJavaで実行。LangChain4jやQuarkusで使用。 |
| リアルタイムグラフィックス | TornadoVM-Ray-Tracerは完全にJavaで書かれたインタラクティブなレイトレーシングを実装。 |
| コンピュータビジョン / 3D再構築 | kfusion-tornadovmはGPU上でKinectFusionパイプラインを実装。 |
| 科学技術・工学コード | 行列計算(SGEMV/SGEMM)、FFT、物理シミュレーション、金融モデリング – すべてcuBLAS/cuFFTの加速により恩恵を受ける。 |
| 一般データ並列ワークロード | あらゆる「 embarrassingly parallel なループ」は@Parallelでアノテートし、アルゴリズムを書き換えることなくGPUまたはCPUにオフロード可能。 |
📦 クイックスタート
- インストール –
sdk install tornadovm(opencl、cuda、metal、またはfullを選択)。 - デバイス確認 –
tornado --devices。 - 例の実行 –
java @$TORNADOVM_HOME/tornado-argfile \ -cp $TORNADOVM_HOME/share/java/tornado/tornado-examples-5.2.0.jar \ uk.ac.manchester.tornado.examples.compute.MatrixVectorRowMajor - Mavenプロジェクトに追加 –
<dependency> <groupId>io.github.beehive-lab</groupId> <artifactId>tornado-api</artifactId> <version>5.2.0-jdk21</version> </dependency> - カーネルの作成 – READMEに示されている低レベル
KernelContextAPIを使用するか、高レベルの@Parallelアノテーションを使用。TaskGraphを構築し、必要に応じてライブラリタスク(CuBlas::cublasSgemvなど)を追加し、TornadoExecutionPlanで実行。
🛠️ 主な機能
- マルチバックエンド:OpenCL、CUDA、Metal、CPUフォールバック。
- ネイティブNVIDIAライブラリサポート:cuBLAS/cuBLASLt、cuFFT、cuDNN(flash-attention含む)、Tensor-Coreインプリント。
- TaskGraph抽象化 – 宣言的なデータ転送、カーネル起動、ライブラリ呼び出し。
- CUDA Graphキャプチャ – 低オーバーヘッドの繰り返し実行。
- クロスプラットフォーム:Linux、macOS、Windowsで動作。OpenCL経由で統合GPUとFPGAもサポート。
- SDKMAN! ディストリビューション および Dockerイメージで簡単にセットアップ可能。
- Apache 2.0 API + GPLv2-CEランタイム – 商用利用に非常に柔軟。
👥 コミュニティとサポート
- Slack: https://join.slack.com/t/tornadovmcommunity/...
- GitHub Discussions: https://github.com/beehive-lab/TornadoVM/discussions
- イシュー追跡:新規参加者向けに「good first issue」ラベル付き。
- ドキュメント:ReadTheDocsサイトにプログラミングガイド、ベンチマークガイド、APIリファレンスあり。
- 学術・産業連携:NVIDIA Inception Program参加、Intel、EU、UKRIなどから資金提供。
📜 ライセンス
- Tornado-APIおよび大多数のモジュール – Apache 2.0(コードにコピーレフトなし)。
- ランタイムおよびドライバ – GPLv2 with Classpath Exception(OpenJDKと同様)、下流アプリケーションに対してもコピーレフトなし。
結論 – TornadoVMは、CUDAやOpenCLを自分で書く必要なく、JavaエコシステムにネイティブGPUコードのパフォーマンスをもたらします。すでにLLM推論、レイトレーシング、科学計算などで実用的に使われている、本格的なプロダクション対応プロジェクトです。
関連
- プロジェクト
- Dispatch
- プロジェクト
- プロジェクト
- プロジェクト