本文適合有 JAVA 基礎的人群
作者:DJL-Lanking
HelloGitHub 推出的《講解開源項目》系列。有幸邀請到了亞馬遜 + Apache 的工程師:Lanking,為我們講解 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 的用法以及新特性:
- 使用 ModelZoo 進行目標檢測
- 加載 PyTorch 預訓練模型
- 加載 Apache MXNet 預訓練模型
- 遷移學習案例
- 問答系統案例
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 的接口