PyTorch在深度學習領域中的應用日趨廣泛,得益於它獨特的規划。無論是數據的並行處理仍是動態計算圖,全部都為Python做出了許多簡化。許多論文都挑選運用PyTorch去完成也證明了它在練習方面的功率以及易用性。
在PyTorch領域,雖然布置一個模型有許多挑選,可為Java開發人員准備的選項卻寥寥無幾。
在曩昔,用戶能夠用PyTorchC++寫JNI(JavaNativeInterface)來完成這個進程。最近,PyTorch1.4也發布了試驗性的Java前端。
但是這兩種解決方案都沒有方法能讓Java開發者很好的運用:用戶需要從易於運用和易於保護中二選一。
針關於這個問題,亞馬遜雲服務(AWS)開源了DeepJavaLibrary(DJL),一個為Java開發者規划的深度學習庫。它兼顧了易用性和可保護性,全部運行功率以及內存辦理問題都得到了很好的處理。
DJL運用起來異常簡單。只需幾行代碼,用戶就能夠輕松布置深度學習模型用作推理。那么咱們就開端上手用DJL布置一個PyTorch模型吧。
前期准備
用戶能夠輕松運用maven或許gradle等Java常用配置辦理包來引用DJL。下面是一個示例:
plugins{id'java'}repositories{jcenter()}dependencies{implementation"ai.djl:api:0.4.0"implementation"ai.djl:repository:0.4.0"runtimeOnly"ai.djl.pytorch:pytorch-model-zoo:0.4.0"runtimeOnly"ai.djl.pytorch:pytorch-native-auto:1.4.0"}
然后只需gradlebuild,根本配置就功德圓滿了。
開端布置模型
咱們用到的方針檢測模型來源於NVIDIA在torchhub發布的預練習模型。咱們用下面這張圖來推理幾個能夠識別的物體(狗,自行車以及皮卡)。
能夠經過下面的代碼來完成推理的進程:
publicstaticvoidmain(String[]args)throwsIOException,ModelException,TranslateException{Stringurl="https://github.com/awslabs/djl/raw/master/examples/src/test/resources/dog_bike_car.jpg";BufferedImageimg=BufferedImageUtils.fromUrl(url);Criteriacriteria=Criteria.builder().optApplication(Application.CV.OBJECT_DETECTION).setTypes(BufferedImage.class,DetectedObjects.class).optFilter("backbone","resnet50").optProgress(newProgressBar()).build();try(ZooModelmodel=ModelZoo.loadModel(criteria)){try(Predictorpredictor=model.newPredictor()){DetectedObjectsdetection=predictor.predict(img);System.out.println(detection);}}}
然后,就結束了。相比於其他解決方案動輒上百行的代碼,DJL把一切進程簡化到了不到30行完成。那么咱們看看輸出的成果:
[class:"dog",probability:0.96709,bounds:[x=0.165,y=0.348,width=0.249,height=0.539]class:"bicycle",probability:0.66796,bounds:[x=0.152,y=0.244,width=0.574,height=0.562]class:"truck",probability:0.64912,bounds:[x=0.609,y=0.132,width=0.284,height=0.166]]
你也能夠用咱們方針檢測圖形化API來看一下實際的檢測作用:
你或許會說,這些代碼都包裝的過於凶猛,真實的小白該如何上手呢?
讓咱們仔細的看一下剛才的那段代碼:
//讀取一張圖片Stringurl="https://github.com/awslabs/djl/raw/master/examples/src/test/resources/dog_bike_car.jpg";BufferedImageimg=BufferedImageUtils.fromUrl(url);//創立一個模型的尋覓標准Criteriacriteria=Criteria.builder()//設置應用類型:方針檢測.optApplication(Application.CV.OBJECT_DETECTION)//確認輸入輸出類型(運用默許的圖片處理工具).setTypes(BufferedImage.class,DetectedObjects.class)//模型的過濾條件.optFilter("backbone","resnet50").optProgress(newProgressBar()).build();//創立一個模型對象try(ZooModelmodel=ModelZoo.loadModel(criteria)){//創立一個推理對象try(Predictorpredictor=model.newPredictor()){//推理DetectedObjectsdetection=predictor.predict(img);System.out.println(detection);}}
這樣是不是清楚了許多?DJL建立了一個模型庫(ModelZoo)的概念,引入了來自於GluonCV,TorchHub,Keras預練習模型,huggingface自然語言處理模型等70多個模型。一切的模型都能夠一鍵導入,用戶只需要運用默許或許自己寫的輸入輸出工具就能夠完成輕松的推理。咱們還在不斷的添加各種預練習模型。
了解DJL
DJL是亞馬遜雲服務在2019年re:Invent大會推出的專為Java開發者量身定制的深度學習框架,現已運行在亞馬遜數以百萬的推理使命中。
假如要總結DJL的主要特色,那么便是如下三點:
DJL不設限制於后端引擎:用戶能夠輕松的運用MXNet,PyTorch,TensorFlow和fastText來在Java上做模型練習和推理。DJL的算子規划無限趨近於numpy:它的運用體驗上和numpy根本是無縫的,切換引擎也不會形成成果改動。DJL優秀的內存辦理以及功率機制:DJL擁有自己的資源收回機制,100個小時連續推理也不會內存溢出。JamesGosling(Java創始人)在運用后給出了贊譽:
關於PyTorch的支撐
DJL現已支撐PyTorch1.5。咱們深度整合了PyTorchC++API,開發了一套JNI供給Java的底層支撐。DJL供給各類PyTorch原生算子算法,現在支撐一切的TorchScript模型。
現在能夠在Mac/Linux/Windows全渠道運行DJLPyTorch。DJL具有自檢測CUDA版本的功能,也會自動選用對應的CUDA版本包來運行gpu使命。