djl
引擎无关的 Java 深度学习框架,一套 API 调用 PyTorch/TensorFlow/MXNet/ONNXRuntime
加载项目详情…
本应用为开源项目,仅供学习研究,请遵守其开源协议。
引擎无关的 Java 深度学习框架,一套 API 调用 PyTorch/TensorFlow/MXNet/ONNXRuntime
加载项目详情…
本应用为开源项目,仅供学习研究,请遵守其开源协议。
在 AI 时代,Python 是绝对的主流深度学习语言,拥有 PyTorch、TensorFlow 等成熟生态。然而,当企业级 Java 应用——银行核心系统、保险理赔平台、工业 MES 系统——需要引入 AI 能力时,开发者面临一个尴尬的选择:要么在 Python 微服务中封装模型调用,要么引入 JNI bridge 嫁接 Python 生态。这两种方案都带来了部署复杂度和性能损耗。
Deep Java Library (DJL) 正是为解决这一痛点而生。它是亚马逊云服务 AWS 的团队在内部实践中孵化出的开源框架,旨在为 Java 生态提供原生的、与引擎无关的深度学习能力,让 Java 开发者无需离开熟悉的 JVM 环境,就能训练和部署神经网络模型。
图1:DJL 官方 Logo

DJL 由 AWS 团队于 2019 年正式开源,其核心设计理念源于团队内部的真实需求:大量企业级 Java 应用运行在 AWS 环境中,而这些应用需要调用机器学习能力。当时的做法是启动独立的 Python 推理服务,再通过 HTTP 或 gRPC 调用——这不仅增加了运维复杂度,也引入了网络延迟。
AWS 团队认为,如果能在 Java 代码中直接调用深度学习引擎,就能彻底消除这种架构上的语言鸿沟。经过内部多年打磨后,DJL 以开源形式发布,迅速吸引了来自金融、医疗、制造等领域的关注。
DJL 不是一个新的深度学习引擎,而是一个引擎无关的抽象层。它定义了统一的 API,底层可以接入 MXNet、PyTorch、TensorFlow、ONNXRuntime 等多种主流引擎。
这种设计的精妙之处在于:开发者在写代码时无需关心底层用的是什么引擎,切换引擎只需要改一行配置,无需重写业务逻辑。换个角度说,DJL 之于深度学习引擎,就像 JDBC 之于数据库驱动——提供了统一接口,屏蔽了底层差异。
图2:DJL 架构图

从架构上看,DJL 的模块划分非常清晰:
DJL 追求的是极致的 Java 原生感。以下是一个完整的图像分类推理代码示例:
// 加载预训练 ResNet50 目标检测模型
Criteria<Image, Classifications> criteria = Criteria.builder()
.optApplication(Application.CV.OBJECT_DETECTION)
.setTypes(Image.class, Classifications.class)
.optFilter("backend", "pytorch") // 指定引擎,也可不指定自动选择
.build();
Image img = ImageFactory.getInstance().fromUrl("http://example.com/image.jpg");
try (ZooModel<Image, Classifications> model = criteria.loadModel();
Predictor<Image, Classifications> predictor = model.newPredictor()) {
Classifications result = predictor.predict(img);
System.out.println(result);
}
整个过程不需要任何 Python 环境,不需要安装 CUDA 驱动,所有依赖通过 Maven/Gradle 自动管理。这对于 Java 后端开发者来说是巨大的认知减负——深度学习不再是神秘的另一个世界的东西,而是一个可以通过 build.gradle 引入的普通依赖。
训练代码同样简洁,使用内置的 Block(神经网络层)组合即可构建自定义模型:
Block block = new Mlp(28 * 28, 10, new int[]{128, 64});
Model model = Model.newInstance("mlp");
model.setBlock(block);
// ... 数据加载、训练配置、训练循环
DJL 的多引擎支持是其最大亮点之一。不同的引擎在性能和功能上各有侧重:
| 引擎 | 优势场景 | 特点 |
|---|---|---|
| MXNet | 经典模型、生产部署 | 最早支持,成熟稳定 |
| PyTorch | 研究实验、动态图 | 生态最丰富,社区活跃 |
| TensorFlow | 生产推理、TF SavedModel | 工业界广泛使用 |
| ONNXRuntime | 跨框架推理、轻量 | 性能优化出色 |
开发者可以在运行时根据场景需求选择引擎:只需在 Criteria 中指定 .optEngine(EngineNames.PYTORCH) 即可。对于生产环境,建议通过基准测试(DJL 提供 benchmark 工具)评估不同引擎在目标硬件上的实际性能。
DJL 的部署天然贴合 Java 应用的发布流程。模型文件(.pt、.pb、.onnx 等)可以打包进 JAR,作为 Maven/Gradle 依赖发布到私有仓库,或放在 S3/HDFS 等分布式存储中按需加载。
模型服务方面,DJL 官方维护独立的 djl-serving 项目(托管在 deepjavalibrary/djl-serving 仓库),这是一个高性能通用模型服务组件,支持 PyTorch、TensorFlow、MXNet 模型的一键部署,并可通过扩展支持 ONNX、XGBoost、LightGBM 等更多格式。如果仅需要推理能力,djl-serving 是比自行搭建 Python 服务更轻量的选择。
图3:DJL 推理流程示意

不过需要注意的是,DJL 本身没有 Web UI,是面向开发者的 Java 库。如果需要可视化的模型管理界面,需要结合 djl-serving 或自行在 Java 应用中集成 Spring Boot + Thymeleaf/Vue 实现。
没有任何框架是银弹,DJL 也面临一些现实挑战:
1. 生态丰富度不及 PyTorch/TensorFlow:作为相对小众的 Java 深度学习框架,DJL 的预训练模型库和社区贡献模块不如 Python 生态丰富。某些前沿模型可能没有现成的 DJL 实现,需要自行移植。
2. GPU 训练效率依赖底层引擎:DJL 的训练性能完全取决于底层引擎的 CUDA 实现。对于大规模训练场景,Python 原生框架仍然是更优选择,DJL 更适合推理和小规模训练场景。
3. 中文社区较小:官方文档质量较高,但中文资料相对匮乏。
4. JDK 版本兼容需要关注:虽然 DJL 支持 Java 8+,但部分新特性可能带来长期兼容性问题,需要关注版本演进。
在数字化转型的大背景下,企业积累了大量 Java 技术栈的遗留系统和微服务架构。DJL 的出现为这些系统提供了一条低门槛引入 AI 能力的路径——无需重构技术栈,无需引入 Python 运行时,只要在现有的 Java 服务中添加一个 Maven 依赖即可。
从技术趋势看,大型语言模型(LLM)推理正在成为企业 AI 的新重心,DJL 也已跟进:extensions/genai 模块提供了对大语言模型推理的基础支持。结合 djl-serving,Java 团队可以在不引入 LangChain 等 Python 生态的前提下,构建企业级的 AI 推理管道。
总的来说,DJL 的核心价值不是取代 Python 深度学习生态,而是将 AI 能力桥接到 Java 企业应用的现有生命周期中。它是一把钥匙,打开了企业 Java 系统接入 AI 能力的大门。