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にオフロード可能。

📦 クイックスタート

  1. インストールsdk install tornadovmopenclcudametal、またはfullを選択)。
  2. デバイス確認tornado --devices
  3. 例の実行
    java @$TORNADOVM_HOME/tornado-argfile \
         -cp $TORNADOVM_HOME/share/java/tornado/tornado-examples-5.2.0.jar \
         uk.ac.manchester.tornado.examples.compute.MatrixVectorRowMajor
    
  4. Mavenプロジェクトに追加
    <dependency>
      <groupId>io.github.beehive-lab</groupId>
      <artifactId>tornado-api</artifactId>
      <version>5.2.0-jdk21</version>
    </dependency>
    
  5. カーネルの作成 – READMEに示されている低レベルKernelContext APIを使用するか、高レベルの@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ランタイム – 商用利用に非常に柔軟。

👥 コミュニティとサポート


📜 ライセンス

  • Tornado-APIおよび大多数のモジュール – Apache 2.0(コードにコピーレフトなし)。
  • ランタイムおよびドライバ – GPLv2 with Classpath Exception(OpenJDKと同様)、下流アプリケーションに対してもコピーレフトなし。

結論 – TornadoVMは、CUDAやOpenCLを自分で書く必要なく、JavaエコシステムにネイティブGPUコードのパフォーマンスをもたらします。すでにLLM推論、レイトレーシング、科学計算などで実用的に使われている、本格的なプロダクション対応プロジェクトです。

関連

  • プロジェクト
  • Dispatch
  • プロジェクト
  • プロジェクト
  • プロジェクト