Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >基于OpenGL ES的深度学习框架编写

基于OpenGL ES的深度学习框架编写

作者头像
CSDN技术头条
发布于 2018-02-12 09:24:50
发布于 2018-02-12 09:24:50
2.7K0
举报
文章被收录于专栏:CSDN技术头条CSDN技术头条

背景与工程定位

背景

项目组基于深度学习实现了视频风格化和人像抠图的功能,但这是在PC/服务端上跑的,现在需要移植到移动端,因此需要一个移动端的深度学习的计算框架。

同类型的库

  • caffe-Android-lib 目前应该是最便于集成使用的深度学习框架库。
  • tensorflow和mxnet据说也有对应的android库,因时间原因暂未测试
  • CNNdroid,网址https://zhuanlan.zhihu.com/p/25259452,这个是用

renderscript 作优化的深度学习框架,不过就代码实现和实际测试结果来看,性能一般。

工程定位

实现可实时、体积小、通用的深度学习预测框架。

可实时

跟PC或服务器不同,移动设备上的GPU可不一定有CPU强悍(多线程+neon/vfp),但在需要实时计算的场景(主要是相机预览和视频播放),往往都是基于OpenGL渲染环境的。

实时的情况下,深度学习框架的输入和输出都在GPU端,使用CPU进行计算往往需要拷贝图像出来,算好后再传到GPU端,因此基于GPU实现的深度学习的库能持平CPU版本的效率就有足够优势了。

比如实时抠人像这个case:

对每一帧相机预览产生的数据,系统将其映射为opengl 的一个external texture,然后需要 计算出一个 mask texture,与原先的texture作混合,显示出来。如果mask texture 的计算在cpu上进行,则需要每帧先把 graphicbuffer 的数据拷贝出来,计算出mask后上传到 mask texture 去,产生一来一回两次额外拷贝。

通用

本工程需要支持 caffe 产出的模型文件,支持常见的网络如lenet、ResNet等等。这个工作量包括编写相应层的算子,设计网络结构,解析caffe模型的参数等。

所幸的是,目前在移动端做好深度学习的预测就足够了,相比于兼顾训练的结构至少省去2/3的工作量。

工程实现

方案选型

GPU加速的API

使用GPU加速有如下一些方案:

CUDA、OpenCL、OpenGL(ES)、RenderScript、Metal CUDA只适用到NVIDIA的GPU,Metal只适用于apple系列,这两个对android设备而言基本不用考虑。

对于OpenCL,虽然有不少移动GPU已经支持,比如 Arm 的 mali 系列(T628之后),且有相应的支持库。但是,一方面由于Android在系统层面上没有支持,没有相应的系统API,兼容性还是比较差,另一方面,OpenCL 操作完成后的内存传到OpenGL还是需要同步一下,会影响效率。

RenderScript 这个坑比较多,文档极少,而且会有跟OpenCL一样的需要跟OpenGL同步的问题,不做考虑。 最后就只剩下 OpenGL ES,为了开发方便,用 Computer shader 实现,尽管会有一定的兼容性牺牲(Android 5.1 及以上,GPU支持openGLES 3.1),但考虑到下面两点是值得的:

1. 走渲染管线去实现通用计算,编程复杂且容易出错,调优也很麻烦。有 computer shader之后,编程就跟opencl、metal类似,这些工作量可以大幅降低,大大加快开发。 2. 支持OpenGLES 3.1版本的GPU一般都是相对较新的,性能不会太差,能够实现加速的目的。

运算的分配

CNNdroid中仅用GPU加速卷积层的运算,其他还是由CPU+多线程执行。以前我们在早期作gpu加速的预研时,也有过类似的尝试,但是数据传输和同步的性能消耗远大于协同计算带来的性能提升。因此这个工程中,网络中的计算全部由GPU完成,避免数据在CPU和GPU之间反复传输或同步。

另外,GPU驱动在申请内存(分配纹理所需要内存空间)的时间消耗在移动设备端是不可忽略的,因此,不能在运算过程中临时创建纹理或其他Buffer,必须事先分配好。

优化注意点

1. 向量化运算

预测时,我们输入神经网络的数据可表示为 w∗h∗d的三维数据。我们将输入数据用一个RGBA32F格式的3D纹理存维,由于每一个像素有4个数值,得到的纹理大小是w∗h∗ceil(d4)。

对于卷积层和内积层,我们把参数存储为mat4的数组,然后其计算就完全是vec4级的向量化运算。

2. 合适的localsize设计

与OpenCL不一样,computer shader 必须手动指定 workgroup 的大小,并且指定运行的 workgroup 数量。这两组维度,都是越大越好。

local size 一般而言越大越好,但 computer shader 所需要的寄存器越多,local size 的最大值就越小,考虑到最耗时的卷积shader所能使用的local size 一般也就 64,保守起见都定为64(8乘8)。

不能对齐的情况在shader中处理,比如下面的代码:

3. 适当地合并/去除layer

如正则层可以直接和上一层合并(末尾加个max处理就行),dropout层可以直接丢弃。 合并可以提升性能(不过不会太多),但最重要的是减少了中间内存。

框架设计

分为两个子模块,引擎模块在客户端上运行,工具模块用来转换caffe的模型文件。

引擎模块

1. 数据层

Image 为一个RGBA32F格式的2D Array纹理,SSBO为一种vbo, 全称为GL_SHADER_STORAGE_BUFFER,用于存储自定义类型的数据(主要就是卷积层和内积层的参数)。

Program 为 着色器链接而成的 opengl program,NetInfo 由 proto 定义,用于规定网络结构。

在 shader 中,image 和 SSBO 示例如下:

2. 算子层

包括各类layer的实现,如卷积、正则、内积(全连接)、Softmax等。 每一个layer要负责申请自己的输出内存(image)。

3. 结构层

根据 NetInfo 的信息,创建各类算子并构成DAG(有向无环图),执行运算并输出结果。

下图是lenet的dag示例:

工具模块

一个结构转换器、参数初始化和拷贝工具。拷贝工具是比较容易出错的,因为卷积层和内积层的参数需要补零对齐及重排。

性能与效果

跟开源的caffe-android-lib对比:https://github.com/sh1r0/caffe-android-lib

库大小

  • caffe-android-lib 11M
  • DeeplearningOGL 440K

全自主开发的,毫无疑问要小很多很多。

运行效率

Oppo R9 (MT6755, GPU: Mali-T860)上的测试结果:

连续运行十次,去除第一次的结果(移动设备上一般都是动态调频的,第一次跑的时候CPU/GPU的频率还没调起来,会比较慢)。

Lenet 网络:

  • caffe-android-lib:5.0~5.2ms(线程设为4)
  • DeeplearningOGL:3.6-3.8 ms

较CPU版本(包含了neon与多线程优化)提升了 50%左右的效率,已经大大超出预期了,在GPU更好的机器上(如mate8上)表现会更佳。

相比于 CNNdroid 更是好很多了。

人像抠图的场景很流畅,且不需要隔帧计算。

本文来自CSDN博客:http://blog.csdn.net/jxt1234and2010/article/details/71056736

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2017-05-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 CSDN技术头条 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
贾扬清推荐:阿里开源轻量级深度学习框架 MNN,侧重推理加速和优化
MNN 是一个轻量级的深度学习端侧推理引擎,核心解决深度神经网络模型在端侧推理运行问题,涵盖深度神经网络模型的优化、转换和推理。目前,MNN 已经在手淘、手猫、优酷、聚划算、UC、飞猪、千牛等 20 多个 App 中使用,覆盖直播、短视频、搜索推荐、商品图像搜索、互动营销、权益发放、安全风控等场景,每天稳定运行上亿次。此外,菜鸟自提柜等 IoT 设备中也有应用。在 2018 年双十一购物节中,MNN 在天猫晚会笑脸红包、扫一扫明星猜拳大战等场景中使用。
新智元
2019/05/15
3.2K0
贾扬清推荐:阿里开源轻量级深度学习框架 MNN,侧重推理加速和优化
训练好的深度学习模型原来这样部署的!(干货满满,收藏慢慢看)
当我们辛苦收集数据、数据清洗、搭建环境、训练模型、模型评估测试后,终于可以应用到具体场景,但是,突然发现不知道怎么调用自己的模型,更不清楚怎么去部署模型!
计算机视觉研究院
2021/07/30
31.4K0
深度学习三大框架对比
人工智能的浪潮正席卷全球,诸多词汇时刻萦绕在我们的耳边,如人工智能,机器学习,深度学习等。“人工智能”的概念早在1956年就被提出,顾名思义用计算机来构造复杂的,拥有与人类智慧同样本质特性的机器。经过几十年的发展,在2012年后,得益于数据量的上涨,运算力的提升和机器学习算法(深度学习)的出现,人工智能开始大爆发。但目前的科研工作都集中在弱人工智能部分,即让机器具备观察和感知能力,可以一定程度的理解和推理,预期在该领域能够取得一些重大突破。电影里的人工智能多半都是在描绘强人工智能,即让机器获得自适应能力,解决一些之前还没遇到过的问题,而这部分在目前的现实世界里难以真正实现。
用户2368476
2018/06/19
2K0
深度学习三大框架对比
人像抠图 + OpenGL ES 还能这样玩?没想到吧
现在人像分割技术就像当初的人脸检测算法一样,称为广泛使用的基础算法。今天本文介绍的人像留色其实就是三年前某 AI 巨头利用 video 分割技术展示的应用场景:人体区域保留彩色,人体区域之外灰度化。所以人像留色的关键技术在于高精度高性能的分割算法。
字节流动
2021/07/16
2.3K0
人像抠图 + OpenGL ES 还能这样玩?没想到吧
Metal入门教程总结
本文介绍Metal和Metal Shader Language,以及Metal和OpenGL ES的差异性,也是实现入门教程的心得总结。
落影
2018/08/21
5.2K0
Metal入门教程总结
计算机视觉深度学习训练推理框架
前言 本文整理了一些深度学习训练推理框架,涉及计算机视觉、语音、时序任务上的框架,共计20多种。
小白学视觉
2025/02/05
1760
计算机视觉深度学习训练推理框架
【TensorFlow实战——笔记】第2章:TensorFlow和其他深度学习框架的对比
可以看到各大主流框架基本都支持Python,目前Python在科学计算和数据挖掘领域可以说是独领风骚。虽然有来自R、Julia等语言的竞争压力,但是Python的各种库实在是太完善了,Web开发、数据可视化、数据预处理、数据库连接,爬虫等无所不能,有一个完美的生态环境。仅在数据挖掘工具链上,Python就有Numpy、SciPy、Pandas、Scikit-learn、XGBoost等组件,做数据采集和预处理都非常方便,并且之后的模型训练阶段可以和TensorFlow等基于Python的深度学习框架完美衔接。
石瞳禅
2018/09/18
7790
【TensorFlow实战——笔记】第2章:TensorFlow和其他深度学习框架的对比
【移动端DL框架】当前主流的移动端深度学习框架一览
大家好,继之前的12大深度学习开源框架之后,我们准备开通新的专栏《移动端DL框架》,这是第一篇文章,先来做一个总体的介绍,更多的细节可以关注以后的文章。
用户1508658
2019/07/27
1.6K0
深度学习落地移动端——Q音探歌实践(二)
接上文 上一节内容里,我们大致介绍了我们对移动端可用的硬件条件的探索,接下来,我们更专注于介绍一些专注于移动端设备的机器学习框架,以及在Q音探歌,我们接入深度学习服务的一般流程。 4.移动端机器学习框架介绍 深度学习算法推断要在移动端落地,需要着重衡量尺寸和性能的限制,同时又要尽可能的提供给用户较好的体验(推断速度足够快)。Q音探歌倾向使用成熟的机器学习框架快速搭建深度学习服务,我们对比了一些专注于为边缘设备带来高效深度学习的框架,包括NCNN, TensorFlow Lite, Pytorch Mobi
QQ音乐技术团队
2020/05/11
2.6K0
视频精修一帧要花2小时?美图影像研究院的AI只要5.3毫秒!
进入全民短视频时代,人像视频的拍摄也正在迈向专业化。随着固化审美的瓦解,十级磨皮的网红滤镜被打破,多元化的高级质感成为新的风向标,「美」到每一帧是人们对动态视频提出的更高要求。
机器之心
2021/12/13
1K0
视频精修一帧要花2小时?美图影像研究院的AI只要5.3毫秒!
举世瞩目的「深度神经网络」如何应用于移动端?
随着深度学习算法在图像领域中的成功运用,学术界的目光重新回到神经网络上;而随着 AlphaGo 在围棋领域制造的大新闻,全科技界的目光都聚焦在“深度学习”、“神经网络”这些关键词上。与大众的印象不完全一致的是,神经网络算法并不算是十分高深晦涩的算法;相对于机器学习中某一些数学味很强的算法来说,神经网络算法甚至可以算得上是“简单粗暴”。只是,在神经网络的训练过程中,以及算法的实际运用中,存在着许多困难,和一些经验,这些经验是比较有技巧性的。 有道云笔记不久前更新的文档扫描功能中使用了神经网络算法。本文试图以文
CSDN技术头条
2018/02/06
9890
举世瞩目的「深度神经网络」如何应用于移动端?
OpenGL & Metal Shader 编程系列来了,要不要上车?
前面发了一些关于 Shader 编程的文章,有读者反馈太碎片化了,希望这里能整理出来一个系列,方便系统的学习一下 Shader 编程。
字节流动
2023/09/04
1.4K0
OpenGL & Metal Shader 编程系列来了,要不要上车?
【自动编译代码】陈天奇团队TVM重磅更新:直接在浏览器使用GPU
【新智元导读】华盛顿大学陈天奇团队的深度学习自动优化代码生成器TVM发布更新,不需要写一行Javascprit代码,直接就能将深度学习模型编译到WebGL,然后在浏览器运行。 今天,华盛顿大学陈天奇团队开发的TVM发布了更新,不需要写任何JavaScript代码,直接就能把深度学习模型编译到WebGL/OpenGL,然后在浏览器运行。 深度学习离不开TensorFlow,MXNet,Caffe和PyTorch这些可扩展深度学习系统,但它们大多专门针对小范围的硬件平台(例如服务器级GPU)进行优化,要适应其他
新智元
2018/03/21
1.9K0
【自动编译代码】陈天奇团队TVM重磅更新:直接在浏览器使用GPU
小米开源移动端深度学习框架MACE,自主研发,专为IoT设备优化
允中 发自 凹非寺 量子位 报道 | 公众号 QbitAI 这可能是小米目前为止最重要的AI大动作。 昨天(6月28日),在2018开源中国开源世界高峰论坛现场,小米人工智能与云平台副总裁崔宝秋对外宣布,将正式开源小米自研的移动端深度学习框架Mobile AI Compute Engine,简称MACE。 小米方面称,MACE是专门为移动设备优化的深度学习模型预测框架。 近年来,随着移动互联网的深入发展和IoT智能设备的普及,以及用户对智能性,低延迟和隐私保护的诉求变得越来越高,移动设备上的离线深度学习应
量子位
2018/07/20
1.1K0
【腾讯优图首度开源深度学习框架ncnn】主打手机端,同类cpu框架最快
【新智元导读】 腾讯 AI 三大支柱之一的腾讯优图实验室公布了成立以来的第一个开源项目ncnn,这是一个为手机端极致优化的高性能神经网络前向计算框架,无第三方依赖,跨平台,手机端 cpu 的速度快于目前所有已知的开源框架。深度学习+手机端的应用是2017年以来人工智能领域的一大热点。新智元日前对项目的负责人nihui进行独家专访,从项目开发始终、目的、应用、发展方向等进行请教。文章后半部分,我们带来ncnn10大重要功能介绍。 根据新智元获得的最新消息,腾讯社交网络事业群公布了首个AI开源项目,这同时也是腾
新智元
2018/03/23
4.1K0
【腾讯优图首度开源深度学习框架ncnn】主打手机端,同类cpu框架最快
深度学习三大框架对比
人工智能的浪潮正席卷全球,诸多词汇时刻萦绕在我们的耳边,如人工智能,机器学习,深度学习等。
腾讯Bugly
2018/05/22
4.2K9
陈天奇团队发布TVM:把深度学习部署到手机、树莓派等更多硬件
允中 编译整理 量子位 出品 | 公众号 QbitAI △ 陈天奇,华盛顿大学计算机系博士生,此前毕业于上海交通大学ACM班。XGBoost、cxxnet等著名机器学习工具的作者,MXNet的主要贡献
量子位
2018/03/27
1.9K0
陈天奇团队发布TVM:把深度学习部署到手机、树莓派等更多硬件
【Android 音视频开发打怪升级:OpenGL渲染视频画面篇】一、初步了解OpenGL ES
提到OpenGL,想必很多人都会说,我知道这个东西,可以用来渲染2D画面和3D模型,同时又会说,OpenGL很难、很高级,不知道怎么用。
开发的猫
2020/04/01
2.1K0
【Android 音视频开发打怪升级:OpenGL渲染视频画面篇】一、初步了解OpenGL ES
【杂谈】学深度学习的你有GPU了吗
计算机常见的处理器包括CPU和GPU,CPU即中央处理单元(Central processing unit),它是计算机的控制核心。CPU需要很强的通用性来处理各种不同的数据类型,同时在大量的逻辑判断中,包含了大量的分支跳转和中断处理,使得CPU的内部结构异常复杂,不擅长于快速计算。
用户1508658
2019/07/26
1.1K0
【杂谈】学深度学习的你有GPU了吗
深度神经网络移动终端GPU加速实践
我们尝试去工程化深度神经网络并最终落地,当中的一些实践经验通过本文记录下来。
腾讯Bugly
2018/07/19
1.9K0
推荐阅读
相关推荐
贾扬清推荐:阿里开源轻量级深度学习框架 MNN,侧重推理加速和优化
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档