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:

<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-type: OBJECT_DETECTION# 设定输入数据格式, 有的模型支持多种数据格式input-class: java.awt.image.BufferedImage# 设定输出数据格式output-class: ai.djl.modality.cv.output.DetectedObjects# 设定一个筛选器来筛选你的模型model-filter:size: 512backbone: mobilenet1.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.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

  • 区块链必读“上链”哲学:“胖链下”与“瘦链上”

  • 在商业中,如何与人工智能建立共生关系?

真香,朕在看了!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/517943.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【从入门到放弃-ZooKeeper】ZooKeeper入门

前言 ZooKeeper是一个分布式服务协调框架&#xff0c;可以用来维护分布式配置信息、服务注册中心、实现分布式锁等。在Hbase、Hadoop、kafka等项目中都有广泛的应用。随着分布式、微服务的普及&#xff0c;ZooKeeper已经成为我们日常开发工作中无法绕过的一环&#xff0c;本文…

ln: failed to create symbolic link ‘/usr/bin/mysql’: File exists

问题描述&#xff1a; ln -s /usr/local/mysql/bin/mysql /usr/bin 在centos7进行软链接设置的时候&#xff0c;出现了这么问题&#xff1a;问题就是说这个文件已存在&#xff0c; 解决方法&#xff1a;覆盖之前的 ln -sf /usr/local/mysql/bin/mysql /usr/bin

读透《阿里巴巴数据中台实践》,其到底有什么高明之处?

最近阿里巴巴分享了《阿里巴巴数据中台实践》这个PPT&#xff08;自行搜索原始文章&#xff09;&#xff0c;对于数据中台的始作俑者&#xff0c;还是要怀着巨大的敬意去学习的&#xff0c;因此仔细的研读了&#xff0c;希望能发现一些不一样的东西。 读这些专业的PPT&#xf…

如果你也想做实时数仓…

数据仓库也是公司数据发展到一定规模后必然会提供的一种基础服务&#xff0c;数据仓库的建设也是“数据智能”中必不可少的一环。本文将从数据仓库的简介、经历了怎样的发展、如何建设、架构演变、应用案例以及实时数仓与离线数仓的对比六个方面全面分享关于数仓的详细内容。 …

华为云战略投入政企市场,发布华为云Stack

2020年5月15日&#xff0c;华为云发布政企战略&#xff0c;并宣布华为云Stack系列新品正式上市。华为云Stack是位于政企客户本地数据中心的云基础设施&#xff0c;能为政企客户提供在云上和本地部署体验一致的云服务。随着政企智能升级进入深水区&#xff0c;华为云将战略投入政…

如何在 Apache Flink 中使用 Python API?

本文根据 Apache Flink 系列直播课程整理而成&#xff0c;由 Apache Flink PMC&#xff0c;阿里巴巴高级技术专家 孙金城 分享。重点为大家介绍 Flink Python API 的现状及未来规划&#xff0c;主要内容包括&#xff1a;Apache Flink Python API 的前世今生和未来发展&#xff…

阿里云HBase Ganos全新升级,推空间、时空、遥感一体化基础云服务

1、HBase Ganos是什么 Ganos是阿里云时空PaaS服务的自研核心引擎。Ganos已作为云数据库时空引擎与数据库平台融合&#xff0c;建立了以自研云原生数据库POALRDB为基础&#xff0c;联合NoSQL大数据平台&#xff08;Ali-HBASE和X-Pack Spark&#xff09;的完整时空地理信息云化管…

看完这篇操作系统,和面试官扯皮就没问题了!

作者 | Cxuan责编 | Carol来源 | 程序员 cxuan封图 | CSDN 付费下载于视觉中国1、解释一下什么是操作系统操作系统是运行在计算机上最重要的一种软件&#xff0c;它管理计算机的资源和进程以及所有的硬件和软件。它为计算机硬件和软件提供了一种中间层。通常情况下&#xff0c;…

Linux centos7 安装 MySQL5.7.x

文章目录一、下载安装2. wget 下载方式3. 安装4. 初始化数据库二、修改密码2.1. 修改密码2.2. 修改密码2.3. 允许远程访问2.4. 关闭防火墙2.4. 建立mysql软连接一、下载安装 下载地址&#xff1a;https://dev.mysql.com/downloads/mysql/5.7.html#downloads 下载地址&#xff…

顺序结构,选择结构,反编译

顺序结构 Java基本结构就是顺序结构&#xff0c;除非特别指明&#xff0c;否则就按照顺序一句一句的执行顺序结构是最简单的算法结构任何一个算法都离不开的一种基本算法结构 package com.boss.struct;public class ShunXuDemo {public static void main(String[] args) {Sys…

助力共享经济,芝麻信用背后的技术

近期&#xff0c;CCTV9播放了自制的系列纪录片《大数据时代》&#xff0c;该片是国内首部大数据产业题材纪录片&#xff0c;节目细致而生动地讲述了大数据技术在政府治理、民生服务、数据安全、工业转型、未来生活等方面给我们带来的改变和影响。在第四集中&#xff0c;讲述了芝…

你的项目是否真的需要 DevOps?

DevOps即服务&#xff08;DevOps-as-a-Service&#xff09;是一种新兴的开发理念。DevOps作为一种方法&#xff0c;将传统的团队协作转移到开发和运维团队中&#xff0c;通过使用可堆叠的虚拟扩展工具实现自动化。作者 | raghuraji300译者 | Arvin&#xff0c;责编 | 屠敏头图 …

与你同行,才能无障碍

先给大家分享一个笔者的真实故事。前阵子她被诊断得了急性结膜炎&#xff0c;医生切切叮嘱 72 小时里多闭目养神不能目视任何自光源体&#xff0c;“尤其是电脑和手机&#xff01;”医生特地关照了一句。 她好不容易挪回家&#xff0c;想起一整天未能进食&#xff0c;作为淘宝…

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

作者 | 唐磊责编 | Carol来源 | 程序猿石头封图 | CSDN 付费下载于视觉中国最近工作上遇到一个”神奇”的问题&#xff0c;或许对大家有帮助&#xff0c;因此形成本文。问题大概是&#xff0c;我有两个表 TableA&#xff0c;TableB&#xff0c;其中 TableA 表大概百万行级别(存…

ETL异构数据源Datax_datax-web安装部署_10

文章目录1. 解压2. 一键安装3. 修改执行器py地址4. 一键启动5. 查看启动日志6. 访问地址登录7. 操作记录1. 解压 tar -zxvf datax-web-2.1.2.tar.gz2. 一键安装 # 执行一键安装脚本,系统中需要有mysql环境,会自动执行sql文件初始化bin/install.sh cd datax-web-2.1.2/ bin/in…

3D 真的很难吗,瞧瞧支付宝怎么做?

阿里妹导读&#xff1a;图像作为人类感知世界的视觉基础&#xff0c;是我们在这个信息化时代获取信息、表达信息及传递信息的重要手段&#xff0c;而生成图像最高效准确的方式就是由计算机生成、显示、绘制&#xff0c;这些技术又统称计算机图形技术。计算机图形技术已经是许多…

OpenStack发布Ussuri版本 实现智能开源基础设施的自动化

从2010年到2020年&#xff0c;OpenStack项目整整走过了十个春夏秋冬。10年来&#xff0c;关于OpenStack的争议持续不断&#xff0c;但不可否认的是&#xff0c;在不同技术路线的争执中&#xff0c;OpenStack所展现的蓬勃生命力仍无可比拟。据451研究机构2019年9月发布的市场监测…

ETL异构数据源Datax_图形化数据同步_11

数据同步全量增量知识SQL和执行频次不一样&#xff0c;其他的都一样 文章目录一、Oracle同步Mysql(全量)1. 添加项目2. 添加数据源3. 添加任务4. 构建json5. 任务执行6. 查看日志7. 同步数量对比二、Mysql同步Oracle(全量)2.1. 添加构建reader2.2. 添加构建writer2.3. 配置同步…

RocketMQ消息轨迹-设计篇

RocketMQ 消息轨迹主要包含两篇文章&#xff1a;设计篇与源码分析篇&#xff0c;本节将详细介绍RocketMQ消息轨迹-设计相关。 RocketMQ消息轨迹&#xff0c;主要跟踪消息发送、消息消费的轨迹&#xff0c;即详细记录消息各个处理环节的日志&#xff0c;从设计上至少需要解决如…

红帽加速开放混合云创新,助力企业成功迈向开源应用时代

2020年的开局让人有些意想不到&#xff0c;一场新冠疫情给人们的生活带来了前所未有的改变。对于企业更是有着数不尽的困难与挑战。在过去的三个月当中&#xff0c;全世界都面临着有关于“虚拟会议”所带来的便捷与隐患问题&#xff0c;原因在于虚拟会议中对于网络体验与安全的…