JAVA 程序員的寶藏 AI 工具箱 – Deep Java Library (DJL)

轉(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钮科;綁定于具體的深度學習框架唤衫,缺乏框架無關的特性等等。

image

2020年2月的TIOBE程序語言指數(shù) (https://www.tiobe.com/tiobe-index/)

image

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)用馍管。

image

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 的抽象架構我們可以通過下圖進行理解业舍。

image

來源 :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配置中。

image

源代碼:https://gist.github.com/vrakesh/e287f5f0004c53ceeda8e6a547f97d49#file-build-gradle

接下來舒帮,我們就用這張含橄欖球員的圖片進行處理会喝。

image

來源: Offered under Apache-2.0 license on Gluon-CV

針對這張圖片使用下面的這一段代碼來進行推理。這段代碼從model-zoo加載一個SSD模型玩郊,然后從模型中創(chuàng)建一個預測器肢执,并使用predict函數(shù)來識別圖像中的對象。然后一個通過一個helper utility函數(shù)在檢測到的對象周圍畫上框線译红。

image

源代碼:https://gist.github.com/vrakesh/0faacec9e9f8d88c4cb96c8ae812493a#file-simplessdinference-java

這一段代碼標識出圖像中的三個橄欖球運動員预茄,并將結(jié)果保存為工作目錄下的圖片文件ssd.png。

image

這段代碼的長度不大侦厚,理解起來也比較容易耻陕。我們可以很容易地進行調(diào)整,可以測試來自model-zoo的其他模型或者針對自己的需要作出改變刨沦。但是DJL 帶來的但樂趣遠不止如此诗宣。可以使用問題問答模型來訓練您自己的智能化應用想诅,或者使用圖像分類模型來識別雜貨架上的商品等等召庞。在DJL 的github 上有更多有意思的例子,

awslabs/djl?github.com

最后侧蘸,這個介紹能夠讓你DJL產(chǎn)生興趣裁眯。此外鹉梨,也請記住DJL 的三個最有意思的特性:

  • 框架無關
  • 為Java 開發(fā)者而準備
  • 易于開發(fā)部署

注意:

image

更多內(nèi)容請點擊:

JAVA 程序員的 AI 工具箱 – Deep Java Library (DJL) | Amazon Web Services?amazonaws-china.com

?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市疤孕,隨后出現(xiàn)的幾起案子商乎,更是在濱河造成了極大的恐慌,老刑警劉巖祭阀,帶你破解...
    沈念sama閱讀 206,126評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件鹉戚,死亡現(xiàn)場離奇詭異鲜戒,居然都是意外死亡,警方通過查閱死者的電腦和手機抹凳,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評論 2 382
  • 文/潘曉璐 我一進店門遏餐,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人赢底,你說我怎么就攤上這事失都。” “怎么了幸冻?”我有些...
    開封第一講書人閱讀 152,445評論 0 341
  • 文/不壞的土叔 我叫張陵粹庞,是天一觀的道長。 經(jīng)常有香客問我嘁扼,道長信粮,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,185評論 1 278
  • 正文 為了忘掉前任趁啸,我火速辦了婚禮强缘,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘不傅。我一直安慰自己旅掂,他們只是感情好,可當我...
    茶點故事閱讀 64,178評論 5 371
  • 文/花漫 我一把揭開白布访娶。 她就那樣靜靜地躺著商虐,像睡著了一般。 火紅的嫁衣襯著肌膚如雪崖疤。 梳的紋絲不亂的頭發(fā)上秘车,一...
    開封第一講書人閱讀 48,970評論 1 284
  • 那天,我揣著相機與錄音劫哼,去河邊找鬼叮趴。 笑死,一個胖子當著我的面吹牛权烧,可吹牛的內(nèi)容都是我干的眯亦。 我是一名探鬼主播,決...
    沈念sama閱讀 38,276評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼般码,長吁一口氣:“原來是場噩夢啊……” “哼妻率!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起板祝,我...
    開封第一講書人閱讀 36,927評論 0 259
  • 序言:老撾萬榮一對情侶失蹤宫静,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體孤里,經(jīng)...
    沈念sama閱讀 43,400評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡温技,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,883評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了扭粱。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片舵鳞。...
    茶點故事閱讀 37,997評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖琢蛤,靈堂內(nèi)的尸體忽然破棺而出蜓堕,到底是詐尸還是另有隱情,我是刑警寧澤博其,帶...
    沈念sama閱讀 33,646評論 4 322
  • 正文 年R本政府宣布套才,位于F島的核電站,受9級特大地震影響慕淡,放射性物質(zhì)發(fā)生泄漏背伴。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,213評論 3 307
  • 文/蒙蒙 一峰髓、第九天 我趴在偏房一處隱蔽的房頂上張望傻寂。 院中可真熱鬧,春花似錦携兵、人聲如沸疾掰。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽静檬。三九已至,卻和暖如春并级,著一層夾襖步出監(jiān)牢的瞬間拂檩,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評論 1 260
  • 我被黑心中介騙來泰國打工嘲碧, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留稻励,地道東北人。 一個月前我還...
    沈念sama閱讀 45,423評論 2 352
  • 正文 我出身青樓呀潭,卻偏偏與公主長得像钉迷,于是被迫代替她去往敵國和親至非。 傳聞我的和親對象是個殘疾皇子钠署,可洞房花燭夜當晚...
    茶點故事閱讀 42,722評論 2 345