TornadoVM 项目近期发布 2.0 版本,这是该开源项目的重要里程碑。TornadoVM 旨在为 Java 提供异构硬件运行时,让 JVM 团队可以更容易把计算密集型任务迁移到加速器上运行。对于正在 JVM 生态上构建大模型方案的团队来说,这次更新尤其值得关注。
TornadoVM 是什么:给 Java 增加异构加速能力
TornadoVM 可以自动加速 Java 程序,使其在多核 CPU、GPU 以及 FPGA 上运行。它并不会替换现有 JVM,而是在现有 Java 应用之上补齐以下能力:
- 将 Java 代码卸载(offload)到不同硬件后端执行
- 在 Java 堆与硬件加速器之间管理内存与数据传输
- 负责执行计算 kernel(计算内核)
这类能力是现代云计算与机器学习工作负载的关键组件,也让 Java 生态在高性能计算方向有了更“开箱即用”的选择。
JIT 编译到多后端:OpenCL、CUDA PTX 与 SPIR-V
TornadoVM 会在运行时充当 JIT 编译器,将 Java 字节码编译到三种后端之一:
- OpenCL C
- NVIDIA CUDA PTX
- SPIR-V(二进制)
开发者可以根据自身系统环境选择安装并使用对应后端。
哪些 Java 任务适合卸载到 GPU?
并非所有 Java 计算都适合 offload。一般来说,循环迭代之间没有数据依赖的 for-loop 是很好的候选,因为它们天然适合并行化。
典型适用场景包括:
- 以矩阵为核心的机器学习/深度学习
- 物理仿真(如 N-body 粒子计算)
- 金融计算(如 Black-Scholes)
- 计算机视觉、计算摄影
- 自然语言处理、信号处理等
两种并行表达方式:Loop Parallel API 与 Kernel API
TornadoVM 提供两套互补的并行编程方式:
- Loop Parallel API:通过 Java 注解(如
@Parallel、@Reduce)对循环做并行化
- Kernel API:通过
KernelContext 进行更显式的 GPU 风格编程(线程 ID、本地内存、barrier 等概念),风格接近 CUDA/OpenCL/SYCL
方式一:Loop Parallel API(给循环加注解即可)
public static void vectorMul(FloatArray a, FloatArray b, FloatArray result) {
for (@Parallel int i = 0; i < result.getSize(); i++) {
result.set(i, a.get(i) * b.get(i));
}
}
方式二:Kernel/TaskGraph 风格(显式构建执行图)
var taskGraph = new TaskGraph("multiply")
.transferToDevice(DataTransferMode.FIRST_EXECUTION, a, b)
.task("vectorMul", Example::vectorMul, a, b, result)
.transferToHost(DataTransferMode.EVERY_EXECUTION, result);
var snapshot = taskGraph.snapshot();
new TornadoExecutionPlan(snapshot).execute();
纯 Java 的 LLM 推理:GPULlama3.java 与 TornadoVM
团队同时发布了一个基于 TornadoVM 的完整 LLM 推理库:GPULlama3.java。该库用纯 Java 构建,可在 GPU 上进行 LLM 推理,并强调无需外部依赖、全流程都在 Java 内完成,适合希望在 JVM 内闭环大模型推理的场景。
此外,刚发布的 GPULlama3.java v0.3.0 带来性能与易用性提升:
- NVIDIA GPU 上 tokens/sec 约 提升 30%
- 优化 FP16 与 Q8 的 kernel 生成
- 新的 TornadoVM SDK 带来更简化的配置流程(减少复杂 GPU 配置)
- 可在 NVIDIA PTX、OpenCL 上运行,并提供早期 Apple Silicon 支持
- 增强 Quarkus 支持
- 与 LangChain4j 集成(面向 人工智能 应用编排与落地更友好)
当前支持的模型(FP16 / 8-bit 量化)
GPULlama3.java 目前支持若干 FP16(16 位浮点)与 8-bit 量化模型,参数规模主要在个位数十亿级:
- Llama 3.2 (1B) – FP16
- Llama 3.2 (3B) – FP16
- Llama 3 (8B) – FP16
- Mistral (7B) – FP16
- Qwen3 (0.6B) – FP16
- Qwen3 (1.7B) – FP16
- Qwen3 (4B) – FP16
- Qwen3 (8B) – FP16
- Phi-3-mini-4k – FP16
- Qwen2.5 (0.5B)
- Qwen2.5 (1.5B)
- DeepSeek-R1-Distill-Qwen (1.5B)
不同模型会构建不同的执行计划,以匹配相应的模型架构。
工程与生态:IntelliJ 插件 TornadoInsight
团队还开发了 TornadoInsight:一个面向 IntelliJ IDEA 的插件,用于增强 TornadoVM 的开发体验,帮助开发者更顺畅地在 IDE 中进行异构加速相关开发与调试。
路线图:SDKman 与 FFM API
后续路线图包括:
- 让 TornadoVM 通过 SDKman 更易安装与管理
- 将代码库中的 JNI 组件迁移为使用新的 FFM API