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로 오프로드할 수 있습니다. |
📦 시작하기 (빠른 시작)
- 설치 –
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(플래시 어텐션 포함), Tensor-Core 인트린식.
- TaskGraph 추상화 – 선언적 데이터 전송, 커널 실행, 라이브러리 호출.
- CUDA 그래프 캡처 – 낮은 오버헤드의 반복 실행을 위한 기능.
- 크로스 플랫폼: 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 프로그램 참여, Intel, EU, UKRI 등으로부터 자금 지원.
📜 라이선스
- Tornado-API 및 대부분의 모듈 – Apache 2.0 (코드에 코피레프트 없음).
- 런타임 및 드라이버 – GPLv2 with Classpath Exception (OpenJDK와 동일), 하류 애플리케이션에도 코피레프트 없음.
결론 – TornadoVM은 CUDA나 OpenCL를 직접 작성하지 않아도, 자바 생태계에 네이티브 GPU 코드의 성능을 제공합니다. 이미 LLM 추론, 레이 트레이싱, 과학 계산 등에서 실용적으로 사용되고 있는, 본격적인 프로덕션 대응 프로젝트입니다.
관련
- 프로젝트
- Dispatch
- 프로젝트
- 프로젝트
- 프로젝트