轉(zhuǎn)載自知乎
前言
這幾年深度學習的爆發(fā)帶來了一個未曾預料到的結(jié)果竭翠,Python 這個曾經(jīng)小眾的語言突然之間變得炙手可熱。究其原因,在Python 的生態(tài)中我們可以容易的找到許多的資源。例如,NumPy用于數(shù)據(jù)計算慨仿、Matplotlib用于數(shù)據(jù)可視化以及MXNet、PyTorch纳胧、TensorFlow等一眾深度學習框架镶骗。相比之下,盡管Java語言仍是最流行的語言之一躲雅,擁有為數(shù)眾多的開發(fā)者鼎姊,尤其在企業(yè)市場擁有最廣泛的應用基礎,但事實上我們很難找到合適的用于深度學習的Java工具或者框架∠嗔蓿現(xiàn)有的為數(shù)不多的工具仍存在著許多的不足相寇,例如:易用性不高,使用的仍是 “低級”的API钮科;綁定于具體的深度學習框架唤衫,缺乏框架無關的特性等等。
2020年2月的TIOBE程序語言指數(shù) (https://www.tiobe.com/tiobe-index/)
StackOverflow 開發(fā)人員的調(diào)查結(jié)果 2019 (https://insights.stackoverflow.com/survey/2019)
Deep Java Library 概述
這就要引出今天的主角 Deep Java Library (簡稱DJL)绵脯。DJL 是一個很新的項目佳励,在2019年12月初的AWS re: invest大會上才正式的發(fā)布出來休里。。簡單來說赃承,DJL是一個使用Java API簡化模型訓練妙黍、測試、部署和使用深度學習模型進行推理的開源庫深度學習工具包瞧剖,開源的許可協(xié)議是Apache-2.0拭嫁。對于Java開發(fā)者而言,可以在Java中開發(fā)及應用原生的機器學習和深度學習模型抓于,同時簡化了深度學習開發(fā)的難度做粤。通過DJL提供的直觀的、高級的API捉撮,Java開發(fā)人員可以訓練自己的模型怕品,或者利用數(shù)據(jù)科學家用Python預先訓練好的模型來進行推理。如果您恰好是對學習深度學習感興趣的Java開發(fā)者巾遭,那么DJL無疑將是開始深度學習應用的一個最好的起點肉康。
DJL是在現(xiàn)有深度學習框架的基礎上使用原生Java概念構建的的開發(fā)庫。它為開發(fā)者提供了深度學習的最新創(chuàng)新和使用前沿硬件的能力恢总,例如GPU、MKL等睬愤。簡單的API抽象并簡化了開發(fā)深度學習模型所涉及的復雜性片仿,使得這個新的框架更易于學習和應用。有了model-zoo中綁定的預訓練模型集尤辱,開發(fā)者可以立即開始將深度學習的SOTA成果集成到Java應用當中砂豌。總所周知光督,JAVA 的設計思想有這樣的一句“Write once, run anywhere”(WORE)阳距。同樣, DJL 的設計目標也設定為不依賴于具體的引擎和深度學習框架结借,可以隨時切換框架筐摘。原則上,基于DJL開發(fā)人員可以編寫在任何引擎上運行的代碼船老。DJL目前提供了Apache MXNet的實現(xiàn)咖熟,預期TensorFlow 與PyTorch 的支持也將在不久后發(fā)布。從目前的實現(xiàn)來看柳畔,DJL使用了JNA(Java Native Access)來實現(xiàn)Apache MXNet操作的調(diào)用馍管。
Java Native Access (JNA)
JNA是一個開源Java庫,它為Java程序提供了訪問Native Shared Library的方法薪韩,而不需要使用Java Native Interface (JNI)确沸。JNA庫使用一個名為foreign function interface library (libffi)的小型的庫來動態(tài)調(diào)用原生代碼捌锭。JNA庫原生的函數(shù),允許代碼按名稱加載庫并檢索指向該庫中的函數(shù)的指針罗捎,然后使用libffi庫調(diào)用它观谦。所有這一切都不需要在頭文件或任何編譯階段的靜態(tài)綁定。開發(fā)人員使用Java接口來描述目標原生庫中的函數(shù)和結(jié)構宛逗,這使得利用原生的平臺特性變得非常容易坎匿。減少了配置和構建JNI代碼的那樣的復雜性。
DJL 提供了對于基礎環(huán)境的管理雷激。為了保證最佳的性能替蔬,提供了基于硬件配置的自動CPU/GPU選擇。DJL提供了對多GPUs的支持屎暇,可以自動檢測是否有可用的GPU承桥。如果GPU可用,它將默認運行在一個GPU上根悼,除非程序中制定使用的GPU數(shù)量凶异。
在模型的訓練期間,如果希望在多個GPU上進行訓練挤巡,或者希望限制使用GPU的數(shù)量(對于較小的數(shù)據(jù)集剩彬,您可能希望限制GPU的數(shù)量),則必須通過設置設備來配置TrainingConfig矿卑。例如喉恋,如果您有8個可用的GPU,并且您希望訓練器在5個GPU上進行訓練母廷,您可以如下配置它轻黑。
int maxNumberOfGpus = 5;
TrainingConfig config = new DefaultTrainingConfig(initializer, loss)
.setOptimizer(optimizer)
.addEvaluator(accuracy)
.setBatchSize(batchSize)
// Set the devices to run on multi-GPU
.setDevices(Device.getDevices(numberOfGpus));
對于Java開發(fā)者,DJL 的API抽象了用于開發(fā)模型的常用函數(shù)琴昆,使得Java開發(fā)人員能夠利用現(xiàn)有的知識簡化向機器學習以及深度學習的轉(zhuǎn)換氓鄙。相信這一點應該是Java 開發(fā)者最希望看到的。關于DJL 的抽象架構我們可以通過下圖進行理解业舍。
來源 :https://miro.medium.com/max/3472/1*ju6OsZqhpAHTnhFHDp4DXQ.png
Deep Java Library 的使用
計算機視覺(CV)是目前深度學習發(fā)展最為成熟的領域抖拦。其中,目標檢測是一種與計算機視覺和圖像處理相關的計算機技術舷暮,用于在數(shù)字圖像和視頻中檢測某一類語義對象(如人蟋座、建筑物或汽車)的實例。目標檢測在計算機視覺的許多領域都有應用脚牍,包括圖像檢索和視頻監(jiān)控向臀。接下來,我們來展示一個目標檢測的例子诸狭,體驗一下DJL的實際表現(xiàn)券膀。該模型使用來自DJL 的model-zoo的預先訓練的Single Shot Detector (SSD)模型君纫,幫助我們從圖像中識別西雅圖海鷹隊(一支職業(yè)美式橄欖球球隊)的隊員。
要將DJL用于應用程序項目芹彬,可以使用IntelliJ IDEA來創(chuàng)建gradle項目蓄髓,并將以下內(nèi)容添加到build.gradle配置中。
源代碼:https://gist.github.com/vrakesh/e287f5f0004c53ceeda8e6a547f97d49#file-build-gradle
接下來舒帮,我們就用這張含橄欖球員的圖片進行處理会喝。
來源: Offered under Apache-2.0 license on Gluon-CV
針對這張圖片使用下面的這一段代碼來進行推理。這段代碼從model-zoo加載一個SSD模型玩郊,然后從模型中創(chuàng)建一個預測器肢执,并使用predict函數(shù)來識別圖像中的對象。然后一個通過一個helper utility函數(shù)在檢測到的對象周圍畫上框線译红。
源代碼:https://gist.github.com/vrakesh/0faacec9e9f8d88c4cb96c8ae812493a#file-simplessdinference-java
這一段代碼標識出圖像中的三個橄欖球運動員预茄,并將結(jié)果保存為工作目錄下的圖片文件ssd.png。
這段代碼的長度不大侦厚,理解起來也比較容易耻陕。我們可以很容易地進行調(diào)整,可以測試來自model-zoo的其他模型或者針對自己的需要作出改變刨沦。但是DJL 帶來的但樂趣遠不止如此诗宣。可以使用問題問答模型來訓練您自己的智能化應用想诅,或者使用圖像分類模型來識別雜貨架上的商品等等召庞。在DJL 的github 上有更多有意思的例子,
最后侧蘸,這個介紹能夠讓你DJL產(chǎn)生興趣裁眯。此外鹉梨,也請記住DJL 的三個最有意思的特性:
- 框架無關
- 為Java 開發(fā)者而準備
- 易于開發(fā)部署
注意:
- 項目地址 :https://github.com/awslabs/djl
- DJL需要JDK 8(或更高版本)讳癌。建議使用JDK8,因為JDK 11+存在一些已知的問題存皂。問題包括SpotBugs與JDK 11+不兼容晌坤。如果使用JDK 11+, SpotBugs將不會被執(zhí)行旦袋。
- 目前DJL 尚不支持分布式模型訓練骤菠。
https://s3.cn-north-1.amazonaws.com.cn/awschinablog/java-programmer's-ai-toolkit-deep-java-library-djl7.jpg
更多內(nèi)容請點擊:
JAVA 程序員的 AI 工具箱 – Deep Java Library (DJL) | Amazon Web Services?amazonaws-china.com