完全基於 Java 的開源深度學習平臺,亞馬遜的大佬帶你上手

削微寒發表於2020-08-20

本文適合有 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 公眾號

相關文章