beehive-lab/TornadoVM

Write Java. Run on GPUs. Fast.

🌪️ TornadoVM – GPU에서의 자바

무엇인가요 – TornadoVM은 순수 자바 커널을 작성하고 NVIDIA, AMD, Intel, Apple Silicon GPU 또는 멀티코어 CPU에서 실행할 수 있는 오픈소스 런타임입니다. 런타임 시점에 Java 바이트코드를 타겟 장치의 네이티브 GPU 언어(CUDA PTX, OpenCL C, Apple Metal MSL)로 JIT 컴파일하며, 호스트-디바이스 간 데이터 이동을 자동으로 처리합니다. NVIDIA 하드웨어에서는 cuBLAS, cuFFT, cuDNN 등의 CUDA 라이브러리 스택에 직접 접근할 수 있으며, Tensor-Core mma.sync 인트린식까지 자바 코드에서 사용할 수 있습니다.


🎯 핵심 아이디어

아이디어 작동 방식
한 번 작성하면 어디서나 실행 CUDA 스타일의 스레드 인덱스(ctx.globalIdx)를 사용하거나 @Parallel 어노테이션으로 루프를 표시합니다. TornadoVM은 TaskGraph를 생성하여 OpenCL, CUDA, Metal, CPU 중 어느 백엔드로도 디스패치할 수 있습니다.
JIT 컴파일 Java 바이트코드 → Graal IR → 백엔드 전용 소스(CUDA PTX / OpenCL C / MSL) → 런타임 컴파일러(NVRTC, OpenCL 드라이버, Metal) → 실제 데이터 크기에 최적화된 네이티브 GPU 바이너리.
제로 JNI 플러밍 수동으로 작성한 네이티브 래퍼가 필요 없으며, 런타임이 자동으로 네이티브 코드를 생성하고 자바 프로세스에 링크합니다.
네이티브 CUDA 생태계 통합 생성된 커널은 라이브러리 호출(cublasSgemv, FFT, cuDNN 연산, Tensor-Core 인트린식)과 장치 버퍼 및 CUDA 스트림을 공유합니다. 사용자 정의 자바 커널과 벤더 최적화 라이브러리 작업을 동일한 그래프에서 혼합할 수 있습니다.
CUDA 그래프 캡처 전체 그래프(커널, 라이브러리 호출, 전송)를 한 번 기록하고 단일 cuGraphLaunch로 재실행할 수 있어, 수동으로 작성한 CUDA와 유사한 실행 오버헤드를 제공합니다.

🚀 일반적인 사용 사례

분야 예제 프로젝트
대규모 언어 모델 추론 GPULlama3.java는 RTX 5090에서 Llama-3, Qwen-3, Mistral 등을 순수 자바로 약 117토큰/초 속도로 실행하며, LangChain4j 및 Quarkus에서 사용 중입니다.
실시간 그래픽스 TornadoVM-Ray-Tracer는 완전히 자바로 작성된 인터랙티브 레이 트레이싱을 보여줍니다.
컴퓨터 비전 / 3D 재구성 kfusion-tornadovm은 GPU에서 KinectFusion 파이프라인을 구현합니다.
과학 및 공학 코드 선형대수 커널(SGEMV/SGEMM), FFT, 물리 시뮬레이션, 금융 모델링 – 모두 cuBLAS/cuFFT 가속화로 이점을 얻습니다.
일반적인 데이터 병렬 워크로드 어떤 '매우 병렬적인' 루프라도 @Parallel로 어노테이션하면 알고리즘을 재작성하지 않고 GPU 또는 CPU로 오프로드할 수 있습니다.

📦 시작하기 (빠른 시작)

  1. 설치sdk install tornadovm (opencl, cuda, metal, 또는 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(플래시 어텐션 포함), Tensor-Core 인트린식.
  • TaskGraph 추상화 – 선언적 데이터 전송, 커널 실행, 라이브러리 호출.
  • CUDA 그래프 캡처 – 낮은 오버헤드의 반복 실행을 위한 기능.
  • 크로스 플랫폼: 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를 직접 작성하지 않아도, 자바 생태계에 네이티브 GPU 코드의 성능을 제공합니다. 이미 LLM 추론, 레이 트레이싱, 과학 계산 등에서 실용적으로 사용되고 있는, 본격적인 프로덕션 대응 프로젝트입니다.

관련

  • 프로젝트
  • Dispatch
  • 프로젝트
  • 프로젝트
  • 프로젝트