关于人工智能:几行代码轻松实现目标检测和图像分类任务基于-Spring-Boot-和-DJL搭建企业级机器学习微服务

40次阅读

共计 5223 个字符,预计需要花费 14 分钟才能阅读完成。

当初 AI 应用领域仿佛有一种趋势,大多数学习利用在 Python 中。Spring Boot 作为在微服务畛域中广泛应用的开源平台,用户能够通过应用 Stock API 创立一个基于 C++ 或者 Python 利用的 RPC API 来实现不同语言的推理工作。然而这将带来大量的保护老本及效率问题——单纯就 RPC 通信来说,仅仅通信的工夫耗费就曾经达到了推理的工夫耗费,这成为整体利用速度晋升的瓶颈。当初好啦,AWS 云服务推出了基于深度学习的开源 Java 库, DeepJavaLibrary (DJL),简化繁琐的开发流程,将更好更稳固的解决方案带给宽广的开发者。

前言

许多 AWS 云服务的用户,无论是初创企业还是大公司,都在逐渐将机器学习 (ML) 和深度学习 (DL) 工作搭载在他们已有产品之上。大量的机器学习工作利用在商业和工业畛域,例如利用在图像和视频中的指标检测,文档中的情感剖析,大数据中的欺诈辨认。只管机器学习利用广泛应用在其余语言中(例如 Python),然而对于宽广已有产品的开发者学习和集成老本仍然很高。试想一下,如果要用另一种语言集成在已有的 Java 服务中,从写代码,编译,测试到最初部署都要做出大量扭转。为了解决用户在这方面上的痛点,这篇文章将提出一种解决问题的新思路:用户无需对已有的资源和人员从新调配,能够间接部署机器学习利用在现有的服务中。

Spring Boot 在生产环境中的利用

Spring Boot 是一个在微服务畛域中广泛应用的开源平台。它的次要特色就是简化了分布式系统散发治理利用的过程。然而就目前来看,用户可选的部署 ML 利用计划比比皆是。就拿推理利用来说,用户能够通过应用 Stock API 创立一个基于 C++ 或者 Python 利用的 RPC API 来实现不同语言的推理工作。只管这个解决方案能够在最短时间内解决部署的当务之急,然而从长期运行的成果来看,它造成了大量的保护老本以及效率问题。单纯就 RPC 通信这一方面来说,可能仅仅通信的工夫耗费就曾经达到了推理的工夫耗费,造成这个解决方案成为整体利用速度晋升的瓶颈。

为了更好的解决开发者的窘境,AWS 云服务推出了基于深度学习的开源 Java 库, DeepJavaLibrary (DJL)。DJL 的服务主旨是简化低廉且繁琐的开发流程,将更好更稳固的解决方案带给宽广的开发者。这篇文章会从一个根本的 Spring boot 利用登程,利用 Deep Java Library (DJL),来集成机器学习利用在微服务中。仅通过几行代码,就能够轻松实现目标检测和图像分类工作。

配置 Spring Boot Starter (SBS)

Spring Boot Starter 是一个一站式的 Spring 库管理工具。它简化了诸多援用新的库须要进行的操作,比方复制粘贴样本代码,批改配置文件等。请参考 Spring Boot Starter 官网指南以获取更多信息。在咱们明天的教学中,咱们将应用 DJL Spring Boot Starter, 一个减少了深度学习部署性能的 SBS。在现有架构的根底上,DJL SBS 削减了主动配置的性能。它使得用户无需放心依赖项,几行代码就能够将它们作为 beans。如果前面有任何一步不是很分明,能够参考咱们示例利用。

依赖项治理

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"

应用 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: 512
      backbone: mobilenet1.0
    # 覆写已有的输入输出配置
    arguments:
      threshold: 0.5 # 只展现预测后果大于等于 0.5

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 的分类器微服务。

理解 DJL


DJL 是 AWS 云服务在 2019 年 re:Invent 大会推出的专为 Java 开发者量身定制的深度学习框架,现已运行在亚马逊数以百万的推理工作中。如果要总结 DJL 的次要特色,那么就是如下三点:

DJL 不设限度于后端引擎:用户能够轻松的应用 MXNet, PyTorch, TensorFlow 和 fastText 来在 Java 上做模型训练和推理。
DJL 的算子设计有限趋近于 numpy:它的应用体验上和 numpy 根本是无缝的,切换引擎也不会造成后果扭转。
DJL 优良的内存治理以及效率机制:DJL 领有本人的资源回收机制,100 个小时间断推理也不会内存溢出。

当初能够在 Mac/Linux/Windows 全平台运行 DJL。DJL 具备自检测 CUDA 版本的性能,也会主动采纳对应的 CUDA 版本包来运行 gpu 工作。想理解更多,请参见上面几个链接:

https://djl.ai
https://github.com/awslabs/djl
也欢送退出 DJL slack 论坛。

正文完
 0