如何打造一个高性能的前端智能推理引擎

简介: 什么是前端智能推理引擎又该如何打造和应用呢?

什么是前端智能推理引擎

在前端智能推理引擎之前,我们先来说一下什么是”端智能”。

端智能(On-Device Machine Learning)是指把机器学习的应用放在端侧做。这里的“端侧”,是相对于云服务而言的。它可以是手机,也可以是 IOT 设备等。

传统的机器学习,由于模型大小、机器算力的问题,很多是放在服务端做的。比如 Amazon AWS 有“Amazon Rekognition Service”,Google 有 “Google Cloud Vision Service”。而随着以手机为代表的端侧设备算力的提高,以及模型设计本身的演进,大小更小、能力更强的模型逐渐能够部署到端上运行。

--参考自《https://www.infoq.cn/article/m5m93qyadscnyil3kprv》

相比云端部署的方式,APP端拥有更直接的用户特征,同时具备如下优势:

  • 实时性高,端侧处理可节省数据的网络传输时间。
  • 节省资源,充分利用端侧算力和存储空间。
  • 隐私性好,产生数据到消费数据都在端侧完成,避免传输引起的隐私泄露风险。

这些是端智能的优势,但它不是万金油,仍然存在一些局限性:

  • 设备资源有限,端侧算力、存储是有限的,不能做大规模高强度的持续计算。
  • 算法规模小,端侧算力小,而且单用户的数据,在算法上并不能做到最优。
  • 用户数据有限,端侧数据不适合长期存储,同时可用数据有限。

同理,前端智能是指将机器学习的应用放到前端上(web、h5、小程序等).

所以,什么是前端智能推理引擎呢?

如下图:
image.png
前端智能推理引擎实际上就是利用前端上算力去执行模型的那个东西。

业界现有的前端推理引擎

这里列出三个常见的推理引擎

  • tensorflow.js(下面简称为tfjs)
  • ONNX.js
  • WebDNN

对于一个端上推理引擎来说,最重要的是什么?当然是性能了!性能越好,也代表在端上的应用场景也会越多,下面我们来看下这三个推理引擎的性能对比:

(下面数据使用模型为MobileNetV2分类模型)

cpu(js计算)

image.png
可以看到,在纯JS环境下进行计算,仅仅做一次分类都要1500ms以上。设想一下如果一个相机需要实时对拍摄的物体做分类预测(比如预测拍摄的对象是猫还是狗),那么每预测一次需要1500ms,这样的性能是无法忍受的。

WASM

image.png
在WASM环境下,性能最佳的ONNX.js达到了135ms的性能,也就是7fps左右,已经到了勉强能用的程度了。而tfjs却是糟糕的1501ms。这里是因为onnx.js利用了worker进行多线程加速,所以性能最好。

WebGL(GPU)

image.png
最后是GPU环境,可以看到tfjs和ONNXjs的性能都达到了比较好的性能水平,而WebDNN表现较为糟糕。

除了上面这三种引擎,目前国内还有百度的paddle.js以及淘宝的mnn.js等,这里不做讨论。

当然,在选择一个合适的推理引擎时,除了性能以外,还有生态、引擎维护情况等等一系列的考虑。从综合的方面来说,tfjs是当下市场上最适合的前端推理引擎。因为tfjs可以依靠tensorflow的强大的生态、google官方团队的全职维护等。相比之下ONNX框架比较小众,且ONNXjs已经有近一年没有维护了。WebDNN性能及生态都没有任何竞争力。

前端上的高性能计算方案

从上一章节其实能看到,在前端上做高性能计算一般比较普遍的就是WASM和基于WebGL的GPU计算,当然也有asm.js这里不做讨论。

WASM

WASM大家应该是比较熟悉的,这里只做下简短的介绍:

WebAssembly是一种运行在现代网络浏览器中的新型代码,并且提供新的性能特性和效果。它设计的目的不是为了手写代码而是为诸如C、C++和Rust等低级源语言提供一个高效的编译目标。

对于网络平台而言,这具有巨大的意义——这为客户端app提供了一种在网络平台以接近本地速度的方式运行多种语言编写的代码的方式;在这之前,客户端app是不可能做到的。

而且,你在不知道如何编写WebAssembly代码的情况下就可以使用它。WebAssembly的模块可以被导入的到一个网络app(或Node.js)中,并且暴露出供JavaScript使用的WebAssembly函数。JavaScript框架不但可以使用WebAssembly获得巨大性能优势和新特性,而且还能使得各种功能保持对网络开发者的易用性。--《摘自MDNWebAssembly概念》

WebGL

啥?WebGL不是做图形渲染的吗?不是做3D的吗?为啥能做高性能计算?

可能一些同学听说过gpgpu.js这个库,这个库就是利用webgl做通用计算的,具体的原理是怎么样的呢?(为了能够继续往下阅读,请先快速浏览下这篇文章):《利用WebGL2 实现Web前端的GPU计算》。

将推理引擎的性能进行极致优化

好了,目前我们知道在前端上的两种高性能计算方式了,那么如果现有的框架(tfjs、onnxjs)性能上就是不满足我们的需求怎么办呢?怎么样才能进一步提升引擎性能,并落地生产环境呢?

答案是:手撕源码,优化性能。对,就是这么简单粗暴。以tfjs为例(其他的框架原理上是一致的),下面给大家介绍下如何用不同的姿势去优化引擎性能。

在去年年初时候,我们团队和google的tfjs团队做了一次深入交流,google那边明确表示tfjs后面的发展方向以WASM计算为主、webgl计算不做新的feature以维护为主。但是现阶段各浏览器、小程序对WASM的支持并不完整(例如SIMD、Multi-Thread等特性),所以WASM暂时无法在生产环境落地。所以,现阶段还是需要依赖webgl的计算能力。糟糕的是,此时tfjs的webgl性能在移动端上表现依旧差强人意,尤其在中低端机上的性能完全达不到我们的业务要求。没办法,只能自己硬着头皮进去优化引擎。所以以下的内容都是针对于webgl计算进行介绍。

优化 WebGL 高性能计算的n种姿势

姿势一:计算向量化

计算向量化是指,利用glsl的vec2/vec4/matrix数据类型进行计算,因为对于GPU来说,最大的优势就是计算并行化,通过向量去计算能够尽可能地达到并行化的效果。

例如一次矩阵乘法:
c = a1 * b1 + a2 * b2 + a3 * b3 + a4 * b4;
可以改为
c = dot(vec4(a1, a2, a3, a4), vec4(b1,b2,b3,b4));

向量化的同时也要配合内存布局的优化;

姿势二:内存布局优化

如果读了上面《利用WebGL2 实现Web前端的GPU计算》这篇文章的同学应该了解到,在GPU内所有的数据存储都是通过Texture的,而Texture本身是一个 长n * 宽m * 通道(rgba)4 的东西,如果我们要存一个3 * 224 * 224 * 150的四维矩阵进去要怎么办呢?肯定会涉及到矩阵的编码,即以一定的格式把高维矩阵存进特性形状的Texture内,而Texture的数据排布又会影响计算过程中的读存性能。例如,举一个较简单的例子:
image.png
如果是常规内存排布的话,计算一次需要按行或者案列遍历矩阵一次,而GPU的cache是tile类型的,即n*n类型的缓存,根据不同芯片n有所不同。所以这种遍历方式会频繁造成cache miss,从而成为性能的瓶颈。所以,我们就要通过内存排布的方式进行性能优化。类似下图:
image.png

姿势三:图优化

由于一个模型是一个一个的算子组成的,而在GPU内每个算子被设计成一个webgl program,每次切换program的时候会造成较多的性能损耗。所以如果有一种手段能够减少模型的program数量,对性能的提升也是十分可观的。如下图:
image.png
我们将一些可以融合的节点在图结构上进行融合(nOP -> 1OP),基于新的计算结点实现新的OP。这样一来大大减少了OP的数量,进而减少了Program的数量,所以提升了推理性能。在低端手机上效果尤为明显。

姿势四:混合精度计算

以上所有的计算都是基于常规浮点数计算,也就是float32单精度浮点数计算。那么,在GPU内是否能实现混合精度的计算呢?例如float16、float32、uint8混合精度的计算。答案是可以的,在GPU内实现混合精度计算的价值是在于提升GPU的bandwidth。由于webgl的texture每一个像素点包含rgba四个通道,而每个通道最高为32位,我们可以在32位内尽可能存储更多的数据。如果精度为float16,那么可以存储两个float16,bandwidth就是之前的2倍,同理uint8的bandwidth是之前的4倍。这个性能的提升就是巨大的。还是上图说话吧:
image.png

姿势n:...

优化的手段还有很多,这里就不一一列举了。

引擎落地的场景

目前,基于我们深度优化的引擎已经落地蚂蚁集团及阿里经济体多个应用场景,比较典型的就是文章开头演示的宠物识别,还有卡证识别、碎屏相机等等等场景。

业界的有之前比较火的虚拟试妆小程序等。

image.png
读到这篇文章的朋友们也可以打开你们的脑洞,挖掘出更多更好玩的智能场景。

未来展望

随着市面是机型的更新换代及引擎的深入优化,我相信tfjs会在更多富交互的场景上大放异彩,例如拥有AI能力的前端游戏、AR、VR等等场景。现在我们要做的就是静下心来,站在巨人的肩膀上持续打磨我们的引擎,愿等花开。

作者:青壁

原文链接 

本文为阿里云原创内容,未经允许不得转载

 

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

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

相关文章

115配额怎么增加_笔电、平板接口少怎么办,ORICO八合一多功能扩展坞助你一臂之力...

现在笔记本电脑大多都往轻薄的外形上发展,保持性能的前提下可以增加移动的便捷性,但是弊端同样明显,那就是牺牲掉了一部分常用接口。比如我手上这部戴尔XPS,左右两侧加起来只有4个可怜的接口,其中还包括一个SD槽&#…

OpenYurt:延伸原生 Kubernetes 到边缘场景下的落地实践

简介: 随着云原生技术的逐步成熟,阿里云容器服务团队在具体落地实践过程中不断探索云原生技术的应用边界。同时随着物联网和 5G 的迅猛发展,传统的边缘计算架构已经不能满足业务发展的需要。 如何基于云原生技术构建新一代的边缘计算平台成为…

对象存储,为什么那么火?

作者|小枣君 来源|鲜枣课堂引言上期文章(链接:关于存储技术的最强入门科普),小枣君给大家详细介绍了数据存储技术的基本知识,其中重点对DAS、SAN和NAS技术进行了对比分析。我们知道,在很长的一段时间里&…

使用react实现select_React笔记——核心概念:9.表单

1、受控组件在 React 中,可变状态(mutable state)通常保存在组件的 state 属性中,并且只能通过使用 setState()来更新。state:唯一数据源渲染表单的 React 组件还控制着用户输入过程中表单发生的操作。被 React 以这种方式控制取值的表单输入…

压测场景下的 TIME_WAIT 处理

简介: 压测场景下的 TIME_WAIT 处理 1. 序 某专有云项目具备压测场景,在Windows的压测机上用 LoadRunner 进行业务的压力测试,压测运行一段时间后出现大量端口无法分配的报错。 其实通过问题描述,以及 Windows的报错信息基本确定…

DataX在数据迁移中的应用

简介: DataX在数据迁移中的应用 1. DataX定义 首先简单介绍下datax是什么。 DataX是阿里巴巴集团内被广泛使用的离线数据同步工具/平台,实现包括 MySQL、Oracle、SqlServer、Postgre、HDFS、Hive、ADS、HBase、TableStore(OTS)、MaxCompute(ODPS)、DRDS…

华为发布《绿色5G白皮书》,定义绿色5G网络八大技术方向

全球“碳达峰、碳中和”已成主流趋势,为了助力全球运营商绿色网络“双碳”行动计划的达成,在华为首届无线媒体沙龙上,华为无线网络SRAN产品线总裁马洪波发表了“绿色5G,E2四化八大方向,共赢双碳未来”主题演讲&#xf…

判断是否包含大写字符_Python最常用的数据类型中字符串基础函数使用知识点讲解...

字符串是 pthon 中最常用的数据类型。我们可以使用单引号、双引号或者三对单双引号来创建字符串。创建字符串很简单,只要为变量分配一个值即可。Python 的字符串有什么内建函数可以使用?len()方法返回对象(字符、列表、元组等)长度或项目个数。每个字符一…

Arthas 使用的各类方式

简介: Arthas 是阿里巴巴开源的 Java 诊断工具。让我们能够在线排查项目发生的问题。除了知道它的存在之外,我们也需要知道我们如何去安装使用它,以便于提高我们日常开发解决 BUG 的效率。 方案介绍 方案一:本地直接运行 往往最…

antd autoplay按f12才会轮播_涨知识了!原来这才是电脑键盘上,F1到F12的正确用法...

在这个快节奏的时代,工作效率可以说是非常重要的,所以熟练掌握电脑就是提高效率的好方法!那如何快速的掌握电脑呢?这就不妨先了解下键盘上F1-F12的正确用法哦,每个都是提高效率的快捷键。F1:获取帮助如果你…

新型数据中心需要什么样的存储

作者:浪潮信息首席架构师 叶毓睿 智算时代的序幕已经拉开,互联的万物,一切皆计算机。智慧计算融入到千行万业的图景,正在徐徐铺开。这是一个数据成为生产要素的时代,智慧计算将劳动者由人变成了人AI,将数据…

王者荣耀服务器未响应8月5日苹果,王者荣耀:世冠小组赛8月5日前瞻预测

14:00 深圳DYG vs GOG深圳DYG在上周的比赛遭遇两连败,目前排在A组倒数第二位。队伍进行人员轮换后,Giao在比赛中的发挥可圈可点,但其他队员的状态都下滑明显。辅助位星宇从春季赛的状态就一般,到本次世冠仍然没有提升,…

多中心容灾实践:如何实现真正的异地多活?

简介: 在异地多活的实现上,数据能够在三个及以上中心间进行双向同步,才是解决真正异地多活的核心技术所在。本文基于三中心且跨海外的场景,分享一种多中心容灾架构及实现方式,介绍几种分布式ID生成算法,以及…

HBM3内存子系统传输速率惊人,带宽突破1TB/S!

记者 | 邓晓娟 8月25日,内存IP厂商Rambus推出HBM3内存接口子系统。内含完全集成的PHY和数字控制器,传输速率达8.4Gbps;可为AI/ML和高性能计算(HPC)等应用和解决方案提供1TB/s的带宽速率;采用标准的16通道设…

android 如何读取cgi_Python基础教程(十):CGI编程、MySQL数据库

Python CGI编程什么是CGICGI 目前由NCSA维护,NCSA定义CGI如下:CGI(Common Gateway Interface),通用网关接口,它是一段程序,运行在服务器上如:HTTP服务器,提供同客户端HTML页面的接口。网页浏览为了更好的了解CGI是如何工作的&…

10亿+文件数压测,阿里云JindoFS轻松应对

简介: Apache Hadoop FileSystem (HDFS) 是被广为使用的大数据存储方案,其核心元数据服务 NameNode 将全部元数据存放在内存中,因此所能承载的元数据规模受限于内存,单个实例所能支撑的文件个数大约 4亿。JindoFS块模式是阿里云基…

一文简单弄懂tensorflow_在tensorflow中设置梯度衰减

我是从keras入门深度学习的,第一个用的demo是keras实现的yolov3,代码很好懂(其实也不是很好懂,第一次也搞了很久才弄懂) 然后是做的车牌识别,用了tiny-yolo来检测车牌位置,当时训练有4w张图片&a…

打破“单点防护”缺陷,山石网科发布“云网端”XDR解决方案

编辑 | 宋 慧 供稿 | 山石网科 出品 | CSDN云计算 近年来,CISO面临的安全形势可谓“内忧外患”,对内面临多样化的网络接入途径、庞大且繁杂的IT资产;对外面临攻防关系、攻防手段、网络攻击的数量等呈指数级增长等问题,给组织的…

Serverless 场景下 Pod 创建效率优化

简介: 众所周知,Kubernetes 是云原生领域的基石,作为容器编排的基础设施,被广泛应用在 Serverless 领域。弹性能力是 Serverless 领域的核心竞争力,本次分享将重点介绍基于 Kubernetes 的 Serverless 服务中&#xff0…

安装wordcloud_COVID19数据分析实战:WordCloud 词云分析

↑↑点击上方蓝字,回复资料,N个G的惊喜前言上一篇文章(链接)我们对COVID19_line_list数据集进行了清洗以及初步分析。本文中我们将分析如何用词云来展示文本信息的概要。比如我们从词云百度百科截取文字,制作词云。简单来说,词云就…