AWS 专家教你快速使用 Spring Boot 和 DJL!

2020 年 5 月 18 日 CSDN

作者 | 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:
   
   
     
<dependency>
   <groupId>ai.djl.spring </groupId>
   <artifactId>djl-spring-boot-starter-mxnet-auto </artifactId>
   <version>${djl.starter.version} </version>  <!-- e.g. 0.2 -->
</dependency>
如果需要使用PyTorch,可以做出如下更改:
   
   
     
<dependency>
   <groupId>ai.djl.spring </groupId>
   <artifactId>djl-spring-boot-starter-pytorch-auto </artifactId>
   <version>${djl.starter.version} </version>  <!-- e.g. 0.2 and above -->
</dependency>
Gradle的配置也十分相似,只需要如下几行:
   
   
     
plugins {
  ...
   id( "org.springframework.boot")
}
repositories {
  mavenCentral()  // 发布的包在maven central
}

dependencies {
  implementation( "ai.djl.spring:djl-spring-boot-starter-mxnet-auto:0.2")
}
注意,由于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:
   
   
     
dependencies {
  implementation( "ai.djl.spring:djl-spring-boot-starter-autoconfigure:${djl.starter.version}")
}
导入这个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 来配置:
   
   
     
djl:
    # 设定应用种类
     application-typeOBJECT_DETECTION
    # 设定输入数据格式, 有的模型支持多种数据格式
     input-classjava .awt.image.BufferedImage
    # 设定输出数据格式
     output-classai .djl.modality.cv.output.DetectedObjects
    # 设定一个筛选器来筛选你的模型
     model-filter:
       size: 512
       backbonemobilenet1 .0
    # 覆写已有的输入输出配置
     arguments:
       threshold: 0 .5 # 只展示预测结果大于等于 0 .5

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.90820bounds: {x=0.487y=0.057width=0.425height=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年软件开发经验,也是开源社区的积极贡献者。

更多精彩推荐

  ☞卖掉 3000 平房子,50 岁程序员回国写代码,三个月内融资 2000 万美元

☞诺基亚的百年沉浮

JavaScript 流行度最高,Java 屈居第三!| 2020 最新软件开发状况报告

深度学习基础总结,无一句废话(附完整思维导图)

震惊!阿里的程序员竟被一个简单的 SQL 查询难住了!

大学生程序员被勒索比特币后,绝地反击!

你点的每个“在看”,我都认真当成了喜欢
登录查看更多
3

相关内容

FPGA加速系统开发工具设计:综述与实践
专知会员服务
65+阅读 · 2020年6月24日
从HPO到NAS: 自动深度学习
专知会员服务
37+阅读 · 2020年6月15日
斯坦福2020硬课《分布式算法与优化》
专知会员服务
118+阅读 · 2020年5月6日
TensorFlow Lite指南实战《TensorFlow Lite A primer》,附48页PPT
专知会员服务
69+阅读 · 2020年1月17日
【干货】大数据入门指南:Hadoop、Hive、Spark、 Storm等
专知会员服务
95+阅读 · 2019年12月4日
阿里技术大牛:一份架构师成神路线图!
51CTO博客
30+阅读 · 2019年7月6日
Deeplearning4j 快速入门
人工智能头条
14+阅读 · 2018年12月24日
Java 工程师快速入门深度学习,可以从 Deeplearning4j 开始
人工智能头条
13+阅读 · 2018年12月14日
深度学习开发必备开源框架
九章算法
12+阅读 · 2018年5月30日
Python 杠上 Java、C/C++,赢面有几成?
CSDN
6+阅读 · 2018年4月12日
10个深度学习软件的安装指南(附代码)
数据派THU
17+阅读 · 2017年11月18日
解析京东大数据下高效图像特征提取方案
京东大数据
4+阅读 · 2017年9月29日
Arxiv
53+阅读 · 2018年12月11日
Arxiv
4+阅读 · 2018年10月5日
Arxiv
8+阅读 · 2018年5月15日
Arxiv
3+阅读 · 2018年3月28日
VIP会员
相关VIP内容
相关资讯
阿里技术大牛:一份架构师成神路线图!
51CTO博客
30+阅读 · 2019年7月6日
Deeplearning4j 快速入门
人工智能头条
14+阅读 · 2018年12月24日
Java 工程师快速入门深度学习,可以从 Deeplearning4j 开始
人工智能头条
13+阅读 · 2018年12月14日
深度学习开发必备开源框架
九章算法
12+阅读 · 2018年5月30日
Python 杠上 Java、C/C++,赢面有几成?
CSDN
6+阅读 · 2018年4月12日
10个深度学习软件的安装指南(附代码)
数据派THU
17+阅读 · 2017年11月18日
解析京东大数据下高效图像特征提取方案
京东大数据
4+阅读 · 2017年9月29日
Top
微信扫码咨询专知VIP会员