完全基于 Java 的开源深度学习平台,亚马逊的大佬带你上手

时间:2024-02-16 17:57:08

本文适合有 Java 基础的人群

作者:DJL-Lanking

HelloGitHub 推出的《讲解开源项目》系列。有幸邀请到了亚马逊 + Apache 的工程师:Lanking( https://github.com/lanking520 ),为我们讲解 DJL —— 完全由 Java 构建的深度学习平台。

介绍

许多年以来,一直都没有为 Java 量身定制的深度学习开发平台。用户必须要进行繁杂的项目配置,构建 class 才能最终打造出属于 Java 的深度学习应用。在那之后,依旧要面临着依赖项匹配维护等各种麻烦的问题。为了解决这个这个痛点,亚马逊开源了 Deep Java Library (DJL)

项目地址:https://github.com/awslabs/djl/

官网:https://djl.ai/

一个完全使用 Java 构建的深度学习平台。DJL 的开发者们也为它量身定制了各种有意思的运行环境,用户只需要少量配置,甚至直接在线就可以在 Java 上运行深度学习应用。

为了简化 Java 开发人员在深度学习上的痛点,我们推出了 DJL 未来实验室计划:致力于打造一个极简的 Java 运行环境,创造属于 Java 自己的深度学习工具箱。你可以轻松在线使用,或者离线使用它们来构建你的深度学习应用。我们的目标是,将深度学习更好的贴近 Java 开发者。

下面将介绍能够让你快速上手 DJL 的在线尝试地址或工具。

在线编译:Block Runner

在线尝试:https://djl.ai/website/demo.html

Block Runner 设计十分简单,它可以直接帮助你在线编译 Java 深度学习代码。如上所示,你只需点击 Run 就可以执行这些代码。我们提供了多种深度学习引擎供你选择。你可以轻松的在上面完成简单的深度学习运算以及推理任务。当你在构建完成之后,直接点击 Get Template 就可以获得一份直接在本地就能运行的 gradle 项目。所有的环境都已经配置好了,用编辑器打开就可以跑简单举一个例子,如下是使用 Apache MXNet 模型构建的一份图片分类应用代码,你可以直接复制到在线编辑器:

import ai.djl.inference.*;
import ai.djl.modality.*;
import ai.djl.modality.cv.*;
import ai.djl.modality.cv.transform.*;
import ai.djl.modality.cv.translator.*;
import ai.djl.repository.zoo.*;
import ai.djl.translate.*;

String modelUrl = "https://alpha-djl-demos.s3.amazonaws.com/model/djl-blockrunner/mxnet_resnet18.zip?model_name=resnet18_v1";
Criteria<Image, Classifications> criteria = Criteria.builder()
    .setTypes(Image.class, Classifications.class)
    .optModelUrls(modelUrl)
    .optTranslator(ImageClassificationTranslator.builder()
            .addTransform(new Resize(224, 224))
            .addTransform(new ToTensor())
            .optApplySoftmax(true).build())
    .build();
ZooModel<Image, Classifications> model = ModelZoo.loadModel(criteria);
Predictor<Image, Classifications> predictor = model.newPredictor();
String imageURL = "https://raw.githubusercontent.com/awslabs/djl/master/examples/src/test/resources/kitten.jpg";
Image image = ImageFactory.getInstance().fromUrl(imageURL);
predictor.predict(image);

在运行后,你会获得如下结果:

[
    class: "n02123045 tabby, tabby cat", probability: 0.41073
    class: "n02124075 Egyptian cat", probability: 0.29393
    class: "n02123159 tiger cat", probability: 0.19337
    class: "n02123394 Persian cat", probability: 0.04586
    class: "n02127052 lynx, catamount", probability: 0.00911
]

最后,你可以直接点击 Get Template 在本地运行。是不是很简单!现在这个组建支持 Apache MXNet/PyTorch/TensorFlow 三个后端引擎,后续还会增加更多的支持。

实现层面上,我们使用了 CodeMirror 在线编辑器以及 SpringBoot 进行后端托管。想了解更多,欢迎参阅实现代码

在线终端工具:JShell

在线尝试:https://djl.ai/website/demo.html#jshell

JShell 是一个 JShell 的改版,包含了 DJL 的特性。你可以直接集成已有的 Java 功能和 DJL 的 class 在线使用。我们为 JShell 提前准备了下面的引入:

import ai.djl.ndarray.NDManager;
import ai.djl.ndarray.NDArray;
import ai.djl.ndarray.types.Shape;
import ai.djl.ndarray.index.NDIndex;
NDManager manager = NDManager.newBaseManager();

后端是基于 SpringBoot 的 server 架构,前端使用了 xtermjs

目前这个命令行支持如下操作:

  • backspace删除输入
  • <--> 移动光标
  • 复制/粘贴代码功能
  • 输入clear进行清屏操作

通过网页中提供的几种简单案例,你可以轻松使用 NDArray 来完成你所需要的功能。

想了解我们是如何构建这个 JShell 应用的,请看实现代码

Java 版的 Jupyter Notebook

地址:https://github.com/awslabs/djl/tree/master/jupyter

什么?Jupyter Notebook?我们难道说的不是 Python?不!100% 纯 Java11。

通过 Spencer Park’s IJava 项目 启发, 我们将 DJL 集成在了 Jupyter Notebook 里面。不需要繁杂的配置,直接启动就能用。我们准备了一系列使用 Jupyter Notebook 构建的 Java 深度学习训练以及推理应用 Notebook。想了解更多就点击这里吧。

Java 版本的 Notebook 可以基本实现所有 Jupyter 在 Python 上的特性:

  • 支持每个代码块独立运行
  • 展示一张图片
  • 利用 Tablesaw 展示一个图表

相比于 Python,Java 的 Notebook 可以直接引入 Maven 的库,这样用户就无需担心项目配置等问题。同时这个 Notebook 也支持在 GPU 环境下运行,你可以轻松使用 Notebook 进行深度学习训练任务。

通过下面几个 Notebook 可以帮助你快速了解 DJL 的用法以及新特性:

P.S:我们甚至还准备了基于 Java 的深度学习书,现在还处于预览版阶段,敬请期待。

关于 DJL 以及未来实验室计划

DJL 还是一个很年轻的框架,2019 年底发布,2020 年 3 月才真正支持了所有主流的深度学习框架 (TensorFlow、PyTorch MXNet)。你可以轻松的使用 DJL 来训练以及部署你的深度学习模型。它也包含了 70 多种来自 GluonCV、HuggingFace、TorchHub 以及 Keras 的预训练模型。

关于未来实验室:我们仍旧还有很多功能处于开发阶段,需要大量小伙伴去参与并且体验我们的新功能。下面是几个正在进行中的项目:

  • D2L - Java:为《动手学深度学习》 打造一本 Java 版本的书
  • DJL NLP WordEmbedding:为 DJL 提供更多 word embedding 的接口

欢迎关注 HelloGitHub 公众号