TornadoVM 2.0 提供 Java 自动 GPU 加速和 LLM 支持
来源: InfoQ - 架构
TornadoVM项目最近达到了2.0版本,这是这个开源项目的一个重要里程碑,该项目旨在为Java提供异构硬件运行时。这个版本可能会特别吸引在JVM上开发LLM解决方案的团队。
该项目可以自动加速多核CPU、GPU和FPGA上的Java程序。它不替换现有的JVM,而是增加了将Java代码卸载到后端的能力,处理Java和硬件加速器之间的内存管理,并运行计算内核。这种能力为现代云和机器学习工作负载提供了一个关键组件。
TornadoVM在运行时编译Java字节码(作为JIT编译器)到三种后端之一:OpenCL C、NVIDIA CUDA PTX和SPIR-V二进制。开发者可以根据他们的特定系统选择安装和运行哪些后端。
请注意,并非所有类型的Java计算都适合卸载到TornadoVM。例如,具有For循环且迭代之间没有依赖关系的工作负载是非常好的候选,因为它们允许并行计算。
特别是,基于矩阵的应用程序,如机器学习和深度学习是很好的候选。这种模式的其他好例子包括物理模拟(例如,N体粒子计算)、金融应用如Black-Scholes,以及计算机视觉、计算摄影、自然语言处理和信号处理等领域的一系列应用。
TornadoVM提供了两种互补的方式来表达并行性:循环并行API,它使用Java注解,如 @Parallel和@Reduce 来并行化循环,以及内核API,它使用 KernelContext 进行显式的GPU风格编程(带有线程ID、局部内存、可用的屏障等概念),类似于CUDA/OpenCL/SYCL。
循环并行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)); } }而内核上下文风格显式地将 TaskGraph 构建为Java对象,如下所示:
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();团队还提供了一个完整的LLM推理库,它是用纯Java构建的,提供GPU上的LLM推理,全部用Java编写,没有外部依赖。
刚刚发布的GPULlama3.java v0.3.0版本带来了显著的性能和可用性提升。
在NVIDIA GPU上性能提升了约30%(每秒令牌数)
优化了FP16和Q8内核生成。
由于新的TornadoVM SDKs,设置更简单——无需复杂的GPU配置。
支持NVIDIA PTX、OpenCL,并支持早期的Apple Silicon。
增强了Quarkus支持
与LangChain4j集成
GPULlama3.java目前支持几种FP16(16位浮点)和8位量化模型,参数范围在十亿以内:
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)
根据所选择的模型,将构建与相关模型体系结构相对应的不同的执行计划。
该项目由Beehive实验室领导,该实验室是曼彻斯特大学高级处理器技术组的一部分,专门从事硬件/软件解决方案的协同设计。
该团队还开发了TornadoInsight,这是一个IntelliJ IDEA插件,它增强了开发者在使用TornadoVM时的体验。
未来的路线图工作包括使TornadoVM在SDKman上可用,并将代码库中的JNI组件迁移到使用新的FFM API。
原文链接: