如何将AI能力与大数据技术结合,助力数据分析治理等工作的效率大幅提升,优化大数据引擎的性能及成本? 了解详情
写点什么

JAVA 程序员的 AI 工具箱 – Deep Java Library (DJL)

  • 2020-02-27
  • 本文字数:2976 字

    阅读完需:约 10 分钟

JAVA 程序员的 AI 工具箱 – Deep Java Library (DJL)

前言

这几年深度学习的爆发带来了一个未曾预料到的结果,Python 这个曾经小众的语言突然之间变得炙手可热。究其原因,在 Python 的生态中我们可以容易的找到许多的资源。例如,NumPy 用于数据计算、Matplotlib 用于数据可视化以及 MXNet、PyTorch、TensorFlow 等一众深度学习框架。相比之下,尽管 Java 语言仍是最流行的语言之一,拥有为数众多的开发者,尤其在企业市场拥有最广泛的应用基础,但事实上我们很难找到合适的用于深度学习的 Java 工具或者框架。现有的为数不多的工具仍存在着许多的不足,例如:易用性不高,使用的仍是 “低级”的 API;绑定于具体的深度学习框架,缺乏框架无关的特性等等。


2020 年 2 月的 TIOBE 程序语言指数 (https://www.tiobe.com/tiobe-index/)
StackOverflow 开发人员的调查结果 2019 (https://insights.stackoverflow.com/survey/2019)

Deep Java Library 概述

这就要引出今天的主角 Deep Java Library (简称 DJL)。DJL 是一个很新的项目,在 2019 年 12 月初的 AWS re: invest 大会上才正式的发布出来。。简单来说,DJL 是一个使用 Java API 简化模型训练、测试、部署和使用深度学习模型进行推理的开源库深度学习工具包,开源的许可协议是 Apache-2.0。对于 Java 开发者而言,可以在 Java 中开发及应用原生的机器学习和深度学习模型,同时简化了深度学习开发的难度。通过 DJL 提供的直观的、高级的 API,Java 开发人员可以训练自己的模型,或者利用数据科学家用 Python 预先训练好的模型来进行推理。如果您恰好是对学习深度学习感兴趣的 Java 开发者,那么 DJL 无疑将是开始深度学习应用的一个最好的起点。


DJL 是在现有深度学习框架的基础上使用原生 Java 概念构建的的开发库。它为开发者提供了深度学习的最新创新和使用前沿硬件的能力,例如 GPU、MKL 等。简单的 API 抽象并简化了开发深度学习模型所涉及的复杂性,使得这个新的框架更易于学习和应用。有了 model-zoo 中绑定的预训练模型集,开发者可以立即开始将深度学习的 SOTA 成果集成到 Java 应用当中。总所周知,JAVA 的设计思想有这样的一句“Write once, run anywhere”(WORE)。同样, DJL 的设计目标也设定为不依赖于具体的引擎和深度学习框架,可以随时切换框架。原则上,基于 DJL 开发人员可以编写在任何引擎上运行的代码。DJL 目前提供了 Apache MXNet 的实现,预期 TensorFlow 与 PyTorch 的支持也将在不久后发布。从目前的实现来看,DJL 使用了 JNA(Java Native Access)来实现 Apache MXNet 操作的调用。


col 1col 2



| Java Native Access (JNA)


JNA 是一个开源 Java 库,它为 Java 程序提供了访问 Native Shared Library 的方法,而不需要使用 Java Native Interface (JNI)。JNA 库使用一个名为 foreign function interface library (libffi)的小型的库来动态调用原生代码。JNA 库原生的函数,允许代码按名称加载库并检索指向该库中的函数的指针,然后使用 libffi 库调用它。所有这一切都不需要在头文件或任何编译阶段的静态绑定。开发人员使用 Java 接口来描述目标原生库中的函数和结构,这使得利用原生的平台特性变得非常容易。减少了配置和构建 JNI 代码的那样的复杂性。


DJL 提供了对于基础环境的管理。为了保证最佳的性能,提供了基于硬件配置的自动 CPU/GPU 选择。DJL 提供了对多 GPUs 的支持,可以自动检测是否有可用的 GPU。如果 GPU 可用,它将默认运行在一个 GPU 上,除非程序中制定使用的 GPU 数量。


在模型的训练期间,如果希望在多个 GPU 上进行训练,或者希望限制使用 GPU 的数量(对于较小的数据集,您可能希望限制 GPU 的数量),则必须通过设置设备来配置 TrainingConfig。例如,如果您有 8 个可用的 GPU,并且您希望训练器在 5 个 GPU 上进行训练,您可以如下配置它。


Java


int maxNumberOfGpus = 5;
TrainingConfig config = new DefaultTrainingConfig(initializer, loss)
.setOptimizer(optimizer)
.addEvaluator(accuracy)
.setBatchSize(batchSize)
// Set the devices to run on multi-GPU
.setDevices(Device.getDevices(numberOfGpus));
复制代码


对于 Java 开发者,DJL 的 API 抽象了用于开发模型的常用函数,使得 Java 开发人员能够利用现有的知识简化向机器学习以及深度学习的转换。相信这一点应该是 Java 开发者最希望看到的。关于 DJL 的抽象架构我们可以通过下图进行理解。


来源 :https://miro.medium.com/max/3472/1*ju6OsZqhpAHTnhFHDp4DXQ.png

Deep Java Library 的使用

计算机视觉(CV)是目前深度学习发展最为成熟的领域。其中,目标检测是一种与计算机视觉和图像处理相关的计算机技术,用于在数字图像和视频中检测某一类语义对象(如人、建筑物或汽车)的实例。目标检测在计算机视觉的许多领域都有应用,包括图像检索和视频监控。接下来,我们来展示一个目标检测的例子,体验一下 DJL 的实际表现。该模型使用来自 DJL 的 model-zoo 的预先训练的 Single Shot Detector (SSD)模型,帮助我们从图像中识别西雅图海鹰队(一支职业美式橄榄球球队)的队员。


要将 DJL 用于应用程序项目,可以使用 IntelliJ IDEA 来创建 gradle 项目,并将以下内容添加到 build.gradle 配置中。


源代码:https://gist.github.com/vrakesh/e287f5f0004c53ceeda8e6a547f97d49#file-build-gradle

接下来,我们就用这张含橄榄球员的图片进行处理。


来源: Offered under Apache-2.0 license on Gluon-CV

针对这张图片使用下面的这一段代码来进行推理。这段代码从 model-zoo 加载一个 SSD 模型,然后从模型中创建一个预测器,并使用 predict 函数来识别图像中的对象。然后一个通过一个 helper utility 函数在检测到的对象周围画上框线。


源代码:https://gist.github.com/vrakesh/0faacec9e9f8d88c4cb96c8ae812493a#file-simplessdinference-java

这一段代码标识出图像中的三个橄榄球运动员,并将结果保存为工作目录下的图片文件 ssd.png。



这段代码的长度不大,理解起来也比较容易。我们可以很容易地进行调整,可以测试来自 model-zoo 的其他模型或者针对自己的需要作出改变。但是 DJL 带来的但乐趣远不止如此。可以使用问题问答模型来训练您自己的智能化应用,或者使用图像分类模型来识别杂货架上的商品等等。在 DJL 的 github 上有更多有意思的例子,https://github.com/awslabs/djl/tree/master/examples


最后,这个介绍能够让你 DJL 产生兴趣。此外,也请记住 DJL 的三个最有意思的特性:


  • 框架无关

  • 为 Java 开发者而准备

  • 易于开发部署


注意:


  • 项目地址 :https://github.com/awslabs/djl

  • DJL 需要 JDK 8(或更高版本)。建议使用 JDK8,因为 JDK 11+存在一些已知的问题。问题包括 SpotBugs 与 JDK 11+不兼容。如果使用 JDK 11+, SpotBugs 将不会被执行。

  • 目前 DJL 尚不支持分布式模型训练。


作者介绍:


费良宏,AWS Principal Developer Advocate。在过去的 20 多年一直从事软件架构、程序开发以及技术推广等领域的工作。他经常在各类技术会议上发表演讲进行分享,他还是多个技术社区的热心参与者。他擅长 Web 领域应用、移动应用以及机器学习等的开发,也从事过多个大型软件项目的设计、开发与项目管理。目前他专注与云计算以及互联网等技术领域,致力于帮助中国的 开发者构建基于云计算的新一代的互联网应用。


本文转载自 AWS 技术博客。


原文链接:https://amazonaws-china.com/cn/blogs/china/java-programmers-ai-to


2020-02-27 16:481480

评论 1 条评论

发布
用户头像
“三个橄榄球运动员”?,不是3个football球员么?
2020-03-26 08:49
回复
没有更多了
发现更多内容

Elasticsearch-Base

lee

elasticsearch search 搜索

硬不硬你说了算!近 40 张图解被问千百遍的 TCP 三次握手和四次挥手面试题

小林coding

面试 TCP 网络安全 网络编程 计算机网络

一文带你了解 Kafka 原理

cxuan

kafka

前端开发必备工具箱

LeanCloud

CSS 性能优化 vscode 大前端 工具

持续集成实践系列 」Jenkins 构建 CI 自动化流水线常见技巧 (二)

狂师

持续集成 jenkins jenkins-plugin CI/CD

大话设计模式 | 1 简单工厂模式

Puran

C# 设计模式 PlantUML

ARTS-Week 01

chasel

修改git里commit信息用户名

张张张小烦

C#和TS的范型实例化

猫定谔的靴

C# typescript 泛型

为什么你在群里的提的技术问题没人回答?

古时的风筝

程序员 提问的艺术

读《平凡的世界》

YoungZY

读书

分布式系统技术:存储之数据库

奈学教育

分布式

Java技术奇迹

ATGU:阿宝哥

《Oracle Java SE编程自学与面试指南》最佳学习路线图(2020最新版)

ATGU:阿宝哥

从技术思维角度聊一聊『程序员』摆地摊的正确姿势

牧码哥

随笔杂谈 技术人生 经验分享

LeetCode 1339. Maximum Product of Splitted Binary Tree

隔壁小王

算法

厉害了,SpaceX-API 开源了

非著名程序员

GitHub 开源 程序员

实时更新:计算机编程语言排行榜—TIOBE世界编程语言排行榜(2020年6月份最新版)

ATGU:阿宝哥

从SDL到DevSecOps:始终贯穿开发生命周期的安全

Fooying

DevOps SDL DevSecOps 安全开发 软件开发生命周期

2020年5月北京BGP机房网络质量评测报告

博睿数据

网络 服务器 存储 机房 主机

程序员未来会成为非常内卷的职业?

非著名程序员

程序员 程序人生 职业 职业规划

createRef、useRef、useMemo对比分析和应用场景

费马

React Hooks useRef useMemo createRef

如何辨别有发展潜力的员工​

Neco.W

工作 招聘

区块链能够防伪?你彷佛有什么误解!

CECBC

CECBC 区块链技术 商品溯源 防伪

2020年6月5日 继承

瑞克与莫迪

关于Synchronized锁升级,你该了解这些

学习Java的小姐姐

并发编程 synchronized 轻量级锁 偏向锁 重量级锁

存储让“想象”势不可挡

焱融科技

cpu分析利器 — async-profiler

捉虫大师

Java cpu profiler

《龙教授私享会职场沟通心法》最佳学习路线(2020最新版)

ATGU:阿宝哥

27岁了,程序员写给自己的一封信

学习Java的小姐姐

程序员 生活 总结 程序媛 职场回顾

ARTS打卡-02

Geek_yansheng25

JAVA 程序员的 AI 工具箱 – Deep Java Library (DJL)_AI_AWS_InfoQ精选文章