关于人工智能:Java-Spring-Boot玩转机器学习

39次阅读

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

很多集体开发者和企业都曾经开始在本人的应用程序中采纳机器学习和深度学习技术。行业的疾速翻新促使各企业采纳机器学习,其波及的业务应用案例从客户服务(包含从图像和视频流进行对象检测、情绪剖析)到欺诈检测与合作不等。

然而就算这些技术十分炽热,但采纳学习曲线依然相当平缓,须要用新的编程语言(例如 Python)和框架开发外部技术专业知识,从而对从编写代码到构建、测试和部署的整个软件开发申明周期产生级联效应。

如何利用现有的技能(例如 Java 编程技术)和资源(框架、管道和部署)来集成机器学习性能?Java + Spring Boot 就能够!

简介

Spring Boot 是用于微服务开发的最罕用且应用最宽泛的开源框架,对分布式系统的施行进行了简化。

只管此框架具备宽泛的吸引力,但将它在本机与 Machine Learning(ML)轻松集成的选项很少。现有解决方案(例如库存 API)通常不满足定制的应用程序要求,且开发定制解决方案很耗时,且不具备老本效益。

开发人员采纳多种形式将机器学习性能集成到现有的应用程序中。以推理为例,以后选项从应用库存 API 到将应用近程调用 API 包装基于 Python 或 C++ 的应用程序用不等。库存 API 尽管基于持重的模型,但可能不太适宜您的域或行业,从而导致在生产中发现问题,且解决这些问题的选项很少。在其余状况下,当大规模运行推理(例如,在流式传输应用程序或提早敏感型微服务中)时,出于性能起因,进行近程调用可能不是可行选项。

意识到这一挑战后,Amazon Web Services (AWS) 创立了几个开源我的项目,以促成 Java 和微服务采纳 ML,从而最终帮忙咱们的客户、合作伙伴以及整个开源社区。这些打算与 AWS 指标严密符合,利用从来老本昂扬且难以被许多组织采纳的技术,并使这些技术能被更加宽泛的受众应用。

在本文中,咱们将演示 Java 用户如何应用实用于 Deep Java Library(DJL)的 Spring Boot Starter,将 ML 集成到本人的 Spring 应用程序中。咱们将回顾如何理论利用这些框架及如何将 ML 性能集成到微服务中,从而演示深度学习在对象检测和分类中的常见应用案例。

DJL 概述

Deep Java Library(DJL)是一个实用于深度学习的开源、高级别、无框架无关的 Java API。它容易入门,并且对于 Java 开发人员来说应用非常简单。DJL 提供本机 Java 开发体验和性能,就像其余惯例 Java 库一样。
DJL 提供方便的形象层来应用最常见的 AI/ML 框架,例如 Apache MXNet、PyTorch 和 TensorFlow。然而,它不仅是在现有库(其中一些提供 Java API/ 绑定)上使用方便。应用 DJL API,咱们将取得平均统一的层,它能够与上述所有框架进行交互,从而使咱们可能替换您抉择的框架,而不对客户端代码造成任何影响。

这一独特的性能联合绝对丰盛的模型园存储库(带有预训练模型的存储库)使 ML 工程师可能为手边的工作查找最佳模型,无论底层模型施行如何。

无关 DJL 的更多信息,请参阅 DJL GitHub 存储库和常见问题。
另外请留神:之前咱们曾公布过一篇专门介绍 DJL 的文章,欢送点击这里查看。

DJL Spring Boot Starter

Spring Boot Starter 是为我的项目所需的所有 Spring 和相干技术提供的一站式服务,借此咱们不用再搜查示例代码并对依赖性描述符进行复制粘贴操作。请参阅 Spring Boot 正式文档理解无关入门版的更多信息。

依照此定义,DJL Spring Boot Starter 将在 Spring 中开始应用 DJL 所需的所有依赖项提供为一个构件。除了依赖项治理之外,该入门版还包含主动配置性能,通过该性能,能够基于用户提供的配置文件主动连贯依赖项,并使它们成为 Spring 应用程序上下文中的内容。

依赖项治理

DJL 库的特定于平台的,但它提供基于指标操作系统主动查找正确依赖项的形式。DJL 还能够配置不同的底层引擎(例如 MXNet、PyTorch 或 TensorFlow);用户应该在应用入门版之前进行此抉择。然而,即便进行了此抉择后,也能够通过批改 Maven(或 Gradle)依赖项来更改底层引擎和指标操作系统架构,而不对咱们的代码造成任何影响。

入门版依赖项治理的组织形式可为用户提供最大的灵活性。

对于 MXNet 入门版,反对以下操作系统分类器:实用于 Mac OS X 的 osx-x86_64、实用于通用 Linux 的 linux-x86_64、实用于 Windows 发行版的 win-x86_64,以及实用于自动检测指标操作系统的 auto。最初一个选项须要在运行时连贯到内部构件存储库(例如 Maven Central),这对于平安限度严格且传入受限的零碎来说可能是个问题。

上面是实用于 Linux 架构的 MXNet 依赖项的示例,针对容器工作负载进行了优化:

<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 is the lowest supported java version, however 12 and 13 should work fine -->
  <jna.version>5.3.0</jna.version> <!-- Required to override default JNA version for Spring Boot parent-->
</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>

将在运行时下载正确构件的 Auto 依赖项:

<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 依赖项看起来相似。重要的是,在 gradle.properties 内将 JNA 版本设置为“jna.version=5.3.0”,因为 Spring Boot 的父级 POM 应用旧版 JNA,它不能与 DJL 入门版一起工作。上面是 Gradle 构建文件 build.gradle.kts 的示例(在本示例中应用 Kotlin DSL),前提是假如已注册 Spring Boot 插件:

plugins {
  ...
  id("org.springframework.boot")
}
repositories {mavenCentral() // released artifacts are available from maven central
}
 
dependencies {implementation("ai.djl.spring:djl-spring-boot-starter-mxnet-auto:0.2")
}

Spring 主动配置

在 Spring Boot 应用程序中正确配置依赖项后,下一步是配置内容并适当连贯它们以进行注入。配置与 DJL 相干的内容并将它们提供在 Spring 应用程序上下文中很容易,但它须要库的外部常识以及适当确定范畴的各个类的个性,例如,有些内容具备线程安全性,有些则应依照申请 / 线程确定范畴。为帮忙进行此配置,DJL Spring Boot 入门版提供了主动配置。

此组件与依赖项组件是离开的,须要显式依赖项。这样做有几个起因:

  1. 有些开发人员更喜爱齐全管制配置选项,且可能不心愿 Spring 施展“主动魔力”。在此状况下,入门版将仅反对根本依赖项集,并且使开发人员显式连贯组件。
  2. 主动配置组件对于所有类型的 DJL 配置都是通用的:无论底层指标操作系统或理论引擎如何,主动配置组件都放弃雷同。因而应用雷同的主动配置,开发人员能够将底层依赖项作为单步操作进行替换,而对代码不产生任何影响。

在 Maven 中申明主动配置的依赖项:

<dependency>
  <groupId>ai.djl.spring</groupId>
  <artifactId>djl-spring-boot-starter-autoconfigure</artifactId>
  <version>${djl.starter.version}</version>
</dependency>

或者在 Gradle build.gradle.kts 中:

dependencies {implementation("ai.djl.spring:djl-spring-boot-starter-autoconfigure:${djl.starter.version}")
}

申明依赖项后,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。与 DJL 相干的配置应在 djl 根下提供命名空间,例如,如果应用 application.properties,则为 djl.application-type=OBJECT_DETECTION。
上面是 DJL 主动配置的 yaml 配置示例:

djl:
    # Define application type
    application-type: OBJECT_DETECTION
    # Define input data type, a model may accept multiple input data type
    input-class: java.awt.image.BufferedImage
    # Define output data type, a model may generate different out put
    output-class: ai.djl.modality.cv.output.DetectedObjects
    # Define filters that matches your application's need
    model-filter:
      size: 512
      backbone: mobilenet1.0
    # Override default pre-processing/post-processing behavior
    arguments:
      threshold: 0.5 # Display all results with probability of 0.5 and above

IDE 反对

配置创立不须要齐全手动进行 —— DJL Spring Boot Starter 在 Spring IDE 插件的帮忙下为大多数 IDE 提供配置内容帮助(在 IntelliJ IDEA 上进行测试,但预期在 Eclipse 中与 STS 和 NetBeans IDE 联合应用)。

对于 IntelliJ,咱们能够应用 Ctrl+Space 进行主动填写,将 Ctrl+ J 用于任何属性的疾速文档。

简略的应用程序演练

上面是基于简略的 Spring Boot 应用程序的代码示例,演示了应用 DJL 和 MXNet 进行的单次对象检测。
依赖项依据 Maven 依赖项局部设置。配置设置与示例中的 application.yml 雷同。应用程序是只有一个类的常控制台 Spring Boot 应用程序(留神不须要其余代码)。

注册预测工具进行对象检测
 

 @Resource
  private Supplier<Predictor> predictorProvider;

在 try-with-resources 数据块中应用预测工具,以确保每次举荐应用后都将其敞开,从而能够注入预测工具的供应商以不便进行实例化。

Java 中的对象检测

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());
    }
}

上述代码将对提供的图像运行对象检测(预计在类门路中),并用以下模式将后果输入到记录器中:

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

或者,能够间接应用 java -jar 命令运行它:

java -jar target/djl-spring-boot-console-sample-${version}.jar

更加简单的应用程序示例

上面是基于利用 DJL Spring Boot Starter 的 REST API 示例的示例代码,演示了一次 RESTful API 施行,该施行能够从 Amazon Simple Storage Service (Amazon S3) 存储桶中获取图像并将对象检测后果存储回 S3 中。此 API 示意能够采纳任何图像参考(已上传到预约义的 Amazon S3 存储桶中)并对其运行对象检测的微服务。能够间接通过 Postman 等 REST 客户端或在挪动或 Web 应用程序内利用它。

API 局部将 Gradle 用作其构建零碎,并利用 Spring MVC 进行 REST API 施行。为简略起见,将控制器作为阻塞调用施行。对于大容量生产应用,倡议应用反馈性款式的 API 实现,例如 WebFlux。对于 Spring Boot 应用程序中的 DJL 组件,将显示一个显式编程配置示例。

Web 应用程序局部作为 Kotlin Spring MVC 利用程序实施,并通过反馈性 REST API 客户端调用后端 API。

用户将看到一个文件列表和一个抉择任何文件进行上传和对象检测的选项,API 输入间接显示在上面:

对象检测的后果将利用回图像中,以突出显示已进行过对象检测且对象已上传到 S3 存储桶的区域:

在后续文章中,咱们将回顾如何对这些应用程序进行容器化以及如何组织全面的 CI/CD 管道部署到 Amazon Elastic Kubernetes Service (Amazon EKS) 中。

论断

在 DJL 和 Spring Boot 中采纳机器学习是一种简略而弱小的办法,利用这种办法,客户能够通过 DJL 和 Spring Boot 提供的不便的形象层来联合久经沙场的现有微服务技术堆栈与最成熟的深度学习框架(如 MXNet、PyTorch 和 Tensorflow)。

参考

1.DJL Spring Boot Starter—Spring Boot 入门版是依据 Apache 2.0 许可证公布的一种开源软件,可使 Spring Boot 开发人员开始应用 DJL 进行推理。
2.DJL Spring Boot 演示 — 蕴含 Java API 的演示存储库,它利用入门版和 Gradle 以及基于 Kotlin 的小型 Web 应用程序。
3.DJL—DJL (Deep Java Library),GitHub 上的次要存储库,依据 Apache 2.0 许可证公布。

正文完
 0