javascript
AWS 专家教你使用 Spring Boot 和 DJL ,轻松搭建企业级机器学习微服务!
作者 |?Qing Lan,Mikhail Shapirov
責編 | Carol
?封圖 | CSDN 下載自視覺中國
出品 | CSDN云計算(ID:CSDNcloud)
許多AWS云服務的用戶,無論是初創企業還是大公司,都在逐步將機器學習 (ML) 和深度學習 (DL) 任務搭載在他們已有產品之上。大量的機器學習任務應用在商業和工業領域,例如應用在圖像和視頻中的目標檢測,文檔中的情感分析,大數據中的欺詐識別。
盡管機器學習應用廣泛應用在其他語言中(例如Python),但是對于廣大已有產品的開發者學習和集成成本依然很高。試想一下,如果要用另一種語言集成在已有的Java服務中,從寫代碼,編譯,測試到最后部署都要做出大量改變。
為了解決用戶在這方面上的痛點,本文將提出一種解決問題的新思路:用戶無需對已有的資源和人員重新調配,可以直接部署機器學習應用在現有的服務中。
Spring Boot在生產環境中的應用
Spring Boot是一個在微服務領域中廣泛應用的開源平臺。它的主要特色就是簡化了分布式系統分發管理應用的過程。但是就目前來看,用戶可選的部署ML應用方案屈指可數。就拿推理應用來說,用戶可以通過使用Stock API 創建一個基于C++或者Python應用的RPC API來實現不同語言的推理任務。
盡管這個解決方案可以在最短時間內解決部署的燃眉之急,但是從長期運行的效果來看,它造成了大量的維護成本以及效率問題。單純就RPC通信這一方面來說,可能僅僅通信的時間消耗就已經達到了推理的時間消耗,造成這個解決方案成為整體應用速度提升的瓶頸。
AWS云服務推出了基于深度學習的開源Java庫https://djl.ai/。主要是為了簡化昂貴且繁瑣的開發流程。
這篇文章會從一個基本的Spring boot 應用出發,利用DJL,來集成機器學習應用在微服務中。僅通過幾行代碼,就可以輕松實現目標檢測和圖像分類任務。
配置Spring Boot Starter (SBS)
Spring Boot Starter 是一個一站式的Spring庫管理工具。它簡化了諸多引用新的庫需要進行的操作,比如復制粘貼樣本代碼,修改配置文件等。請參考Spring Boot Starter官方指南以獲取更多信息。
在本文,我們將使用DJL Spring Boot Starter, 一個增加了深度學習部署功能的SBS。在現有架構的基礎上,DJL SBS增添了自動配置的功能。它使得用戶無需擔心依賴項,幾行代碼就可以將它們作為beans應用在Spring框架下。如果后面有任何一步不是很清楚,可以參考我們示例應用。
DJL Spring Boot Starter:https://github.com/awslabs/djl-spring-boot-starter
自動配置:https://docs.spring.io/spring-boot/docs/current/reference/html/spring-boot-features.html#boot-features-developing-auto-configuration
示例應用:https://github.com/awslabs/djl-spring-boot-starter/tree/master/djl-spring-boot-console-sample
1、依賴項管理
DJL庫可以應用在各種操作系統平臺上,也同時支持多種深度學習引擎,比如TensorFlow 2.0, PyTorch以及MXNet。DJL內建了一系列自動選擇機制,用戶無需選擇運行的操作系統。但是DJL仍舊需要用戶選擇一種或多種深度學習引擎。以MXNet 為例,用戶可以選擇進行如下的配置 (pom.xml):
<parent><artifactId>spring-boot-starter-parent</artifactId><groupId>org.springframework.boot</groupId><version>2.2.6.RELEASE</version> </parent><properties><java.version>11</java.version>?<!--?11?是Java最低支持的版本?--><jna.version>5.3.0</jna.version>?<!--?需要覆寫?JNA?版本--> </properties>?<dependency><groupId>ai.djl.spring</groupId><artifactId>djl-spring-boot-starter-mxnet-linux-x86_64</artifactId><version>${djl.starter.version}</version>?<!--?e.g.?0.2?--> </dependency>用戶可以自己選擇需要運行的平臺,上面 <dependency>?中, linux-x86_64 (Linux) 可以被替換為 win-x86_64 (Windows), 或者 osx-x86_64 (Mac OS)。我們也提供了一種在運行時自動尋找相應系統的全自動依賴項 auto:
如果需要使用PyTorch,可以做出如下更改:
Gradle的配置也十分相似,只需要如下幾行:
注意,由于SpringBoot本身使用了一個舊版的JNA庫,我們需要手動設置gradle.properties 里面的"jna.version=5.3.0"。
2、使用Spring 全自動選擇功能
接下來,我們可以通過添加如下依賴項來使用 Spring的 auto-configuration 來實現自動選擇功能:
<dependency><groupId>ai.djl.spring</groupId><artifactId>djl-spring-boot-starter-autoconfigure</artifactId><version>${djl.starter.version}</version> </dependency>在gradle:
導入這個dependency之后,Spring Boot 會自動配置環境和尋找模型。開發者需要提供一個標準的Spring 配置文件,如 application.yml 或者 application.properties。模型的類型可以選擇下面任意一個:
??QUESTION_ANSWER(NLP.QUESTION_ANSWER),TEXT_CLASSIFICATION(NLP.TEXT_CLASSIFICATION),IMAGE_CLASSIFICATION(CV.IMAGE_CLASSIFICATION),OBJECT_DETECTION(CV.OBJECT_DETECTION),ACTION_RECOGNITION(CV.ACTION_RECOGNITION),INSTANCE_SEGMENTATION(CV.INSTANCE_SEGMENTATION),POSE_ESTIMATION(CV.POSE_ESTIMATION),SEMANTIC_SEGMENTATION(CV.SEMANTIC_SEGMENTATION);比如,如果想進行目標檢測,那么就可以選擇 OBJECT_DETECTION。可以參考下面的 yaml 來配置:
3、IDE 支持
推薦用戶使用IDE,如intelliJ或者Eclipse:Image URL:?
https://github.com/awslabs/djl-spring-boot-starter-demo/raw/master/docs/media/djl-start-ide-support-low-frame-30s.gif
intelliJ可以通過Ctrl+Space?來自動完成Ctrl+J?來快速查詢文檔
運行你的應用
現在我們趕緊試試看之前配置的效果吧。從現在開始,我們只需要兩步就可以完成所有的模型部署運行任務。在此之前,開發者只需要創建一個簡單的單一類Spring應用即可。
第一步:注入 predictor 用來做目標檢測
?@Resource?private?Supplier<Predictor>?predictorProvider;第二步: 運行目標檢測
try?(var?predictor?=?predictorProvider.get())?{var?results?=?predictor.predict(ImageIO.read(this.getClass().getResourceAsStream("/puppy-in-white-and-red-polka.jpg")));for(var?result?:?results.items())?{LOG.info("results:?{}",?result.toString());} }如果你使用了我們的示例,那么在console會顯示如下結果:
a.d.s.e.console.ConsoleApplication:?results:?class:?"dog",?probability:?0.90820,?bounds:?{x=0.487,?y=0.057,?width=0.425,?height=0.484}快速復現
只需如下幾行,便可以輕松運行這個示例應用
git?clone?git@github.com:awslabs/djl-spring-boot-starter.git cd?djl-spring-boot-starter/djl-spring-boot-console-sample? ../mvnw?package? ../mvnw?spring-boot:run我們也提供了一個更復雜的例子,你可以使用多種插件,快速實現一個Restful的分類器微服務。
https://github.com/awslabs/djl-spring-boot-starter-demo/tree/master/djl-spring-boot-app/
了解?DJL
DJL是AWS云服務在2019年re:Invent大會推出的專為Java開發者量身定制的深度學習框架,現已運行在亞馬遜數以百萬的推理任務中。
DJL的主要特色:
1、DJL不設限制于后端引擎:用戶可以輕松的使用 MXNet, PyTorch, TensorFlow和fastText來在Java上做模型訓練和推理。
2、DJL的算子設計無限趨近于numpy:它的使用體驗上和numpy基本是無縫的,切換引擎也不會造成結果改變。
3、DJL優秀的內存管理以及效率機制:DJL擁有自己的資源回收機制,100個小時連續推理也不會內存溢出。
現在可以在 Mac/Linux/Windows全平臺運行DJL。DJL具有自檢測CUDA版本的功能,也會自動采用對應的CUDA版本包來運行gpu任務。想了解更多,請參見下面幾個鏈接,也可以加入 DJL slack論壇。
https://djl.ai
https://github.com/awslabs/djl
作者簡介:
Qing Lan, AWS AI 軟件開發工程師。DJL深度學習框架作者之一,Apache軟件基金會項目管理委員會成員。
Mikhail Shapirov, AWS 資深解決方案架構師,專注于容器類服務。擁有20年軟件開發經驗,也是開源社區的積極貢獻者。
?
推薦閱讀
手把手教你配置VS Code 遠程開發工具,工作效率提升N倍
用大白話徹底搞懂 HBase RowKey 詳細設計
后端程序員必備:書寫高質量SQL的30條建議
Go 遠超 Python,機器學習人才極度稀缺,全球 16,655 位程序員告訴你這些真相!
任正非談“狼文化”:華為沒有 996,更沒有 007
區塊鏈必讀“上鏈”哲學:“胖鏈下”與“瘦鏈上”
在商業中,如何與人工智能建立共生關系?
真香,朕在看了!
總結
以上是生活随笔為你收集整理的AWS 专家教你使用 Spring Boot 和 DJL ,轻松搭建企业级机器学习微服务!的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: IT公司刻板印象合集:程序员都秃头,商务
- 下一篇: 996!007!同是敲了2万行代码,为什