书籍作者:李永会 | ISBN:9787121371820 |
书籍语言:简体中文 | 连载状态:全集 |
电子书格式:pdf,txt,epub,mobi,azw3 | 下载次数:2038 |
创建日期:2021-02-14 | 发布日期:2021-02-14 |
运行环境:PC/Windows/Linux/Mac/IOS/iPhone/iPad/Kindle/Android/安卓/平板 |
《移动深度学习》由浅入深地介绍了如何将深度学习技术应用到移动端运算领域,书中尽量避免罗列公式,尝试用浅显的语言和几何图形去解释相关内容。本书第1章展示了在移动端应用深度学习技术的Demo,帮助读者建立直观的认识;第2章至第4章讲述了如何在移动端项目中应用深度学习技术;第5章至第8章的难度略大,主要讲述如何深入地调整框架,适配并定制自己的框架。
《移动深度学习》适合移动端研发工程师阅读,也适合所有对移动端运算领域感兴趣的朋友阅读。
李永会
百度App移动研发部资深工程师。2015年起在百度从事图像搜索和语音搜索客户端研发工作,主持了多个重要创新项目,包括百度Lens、实时翻译等。同时负责开源移动端深度学习框架Paddle-Lite的开发,长期从事移动端AI高性能计算优化工作,在多种软硬件平台上高性能运行深度学习技术。在工作之余有读史、书法等爱好。
√ 移动端部署神经网络稀缺资源:ARM汇编|NEON指令|Winograd等实战经验。
√ 深入移动计算设备体系结构的 PaddlePaddle 移动深度学习系统 Paddle-Lite。
√ 将深度学习模型以zui小体积和资源消耗运行在移动设备上,同时追求高性能。
√ 商业场景中克服技术挑战如模型压缩|编译裁剪|代码精简|多平台支持|汇编优化。
√ 覆盖移动设备内部结构|汇编指令|CPU性能优化|GPU编程|移动端深度学习框架。
√ 底层框架|上层应用开发双重视角,从应用需求到底层技术优化,再到产品落地。
推荐序一
在过去的十年,人工智能技术尤其是深度学习(Deep Learning)技术得到了飞速发展,从理论到实践都取得了长足的进步,成为解决很多学术和工程问题的利器。在自然语言处理、语音识别、图像识别等领域,利用深度学习技术训练出了堪比人类、甚至超越人类的学习能力。人工智能的成功离不开算法、算力和数据三个要素的协同推进,而这些要素在不同的领域和场景下有不同的表现形式,吸引着人工智能领域的学者、工程师和各个行业的专家们不断探索。
在过去的十年,智能手机快速普及。根据《工业和信息化部关于电信服务质量的通告(2019年第2号)》,我国移动电话用户数量已达到15.97亿户。智能手机成为连接人和信息的重要设备,对于很多人来说,甚至是唯一的设备。在智能手机的底层能力支持下,智能手机上的各类应用(App)蓬勃发展,以苹果的App Store为例,截至2019年第二季度,App Store中可下载的App数量已经超过196万个(数据来自Statista)。硬件和应用程序的共同发展极大地拓展、增强了人类感知、认知世界的能力,这使得智能手机成为人类的“新感官”。
人工智能技术的进步和智能手机的普及是紧密结合、相得益彰的。人工智能技术为智能手机赋能,极大地拓展了智能手机的能力边界;智能手机为人工智能技术提供了丰富的应用场景,为人工智能技术的发展提供了动力。但是,二者的结合也充满了挑战。用户对体验有极致的追求,这就需要智能手机及其上的应用程序能够快速、准确地响应用户的需求。然而,智能手机在计算、存储、续航等方面与电脑等设备的差异巨大,这使得很多人工智能技术无法在智能手机上直接应用,而手机端和服务器端的频繁通信又必然会导致延时和带宽消耗。这些问题在智能手机之外的其他移动设备上也同样存在。
这些富有挑战性的问题正是工程师们的动力源泉。本书作者正是在这样的背景下与同事们一起做了大量探索,以期让人工智能技术在移动端的有限资源下充分发挥价值,并且已经在百度App上取得了非常好的效果。永会把他们团队多年积累的经验凝聚成此书,以飨读者。
本书以百度App中的一些实际案例为线索,简要介绍了理解深度学习的一些必要知识,包括线性代数、卷积神经网络和其他网络结构,然后把更多的笔墨放在了移动设备的内部结构、汇编指令、CPU性能优化、GPU编程以及百度的移动端深度学习框架Paddle-Lite上。书中提供的一些优化技巧具有很好的启发性,希望能够对更多优秀的工程师起到引路作用,帮助大家投身这一领域,充分发挥移动端深度学习的价值,为广大用户提供极致的用户体验。
沈 抖
百度高级副总裁
推荐序二
收到永会的书稿,非常惊喜。永会在移动端深度学习技术的开发和应用领域深耕多年,积累了丰富的经验,也是飞桨(PaddlePaddle)端侧推测推理引擎的核心建设者之一。我想永会的这本书不论是对移动端的框架开发者,还是对应用开发者来说,都是很有价值的。
深度学习凭借其突出的效果和良好的通用性,正推动着人工智能技术迈进工业化阶段。深度学习早已不局限于学术研究,它正在越来越广阔的实际应用中发挥着重要作用。我们也注意到,深度学习应用已从云端扩展到边缘和终端设备。智能手机的普及使得移动端的深度学习技术引起了广泛关注,当然,用户体验和数据隐私等问题是需要考虑的。
百度作为国内深度学习技术研发和应用的领跑者,早在几年之前就已经开始移动端深度学习计算的框架开发和应用工作了。永会作为最早的开发者之一,见证了百度移动端深度学习框架开发和应用的历史,也收获了丰硕的成果,他所做的工作极大地提升了百度App等诸多产品的体验效果,相关技术沉淀也促使了飞桨端侧推测推理引擎的发展和成熟。
虽然永会及其团队所做的很多工作已经通过开源代码展示出来,但是代码库无法全面展示开发者的开发经验和思考感悟。移动端的深度学习开发有很强的特殊性,并且这个领域相对较新,目前还没有太多讲解深入的书籍和资料。这本书正当其时,很有意义。
永会既是底层框架开发者,也是上层应用开发者,这样的双重经验非常难得,而本书的内容也充分体现了这一特质。本书从移动端深度学习应用讲起,从实际应用需求讲到驱动底层技术的优化,最终又通过产品落地收尾,展示移动端深度学习技术的研发对应用的推动。这样的顺序应该是便于大家阅读和理解的。
在移动端应用深度学习技术,既要考虑深度学习技术应用的一般性问题,又要考虑移动端硬件平台和应用的特殊性,想讲好其实挺不容易的。本书的主体内容全面而又精要,显然是下了功夫的。例如,书中对移动端常用算法和硬件存储计算特点的介绍很清晰,能够帮助没有移动端开发和应用经验的读者快速入门,而对于有经验的开发者,也不失为一次系统学习和思考的机会;后面关于移动端CPU和GPU的性能优化部分,则介绍了作者积累的很多实战经验;此外,关于通用矩阵计算加速、快速卷积算法、模型或框架体积优化、内存分析、编译优化等各方面的描述也都做到了深入浅出、细致周到。可以说,本书凝聚了永会长期在一线开发的心得体会,值得仔细品味。
移动端深度学习应用方兴未艾,硬件平台和算法应用都在快速发展,并且正在向广泛的终端设备和边缘计算设备普及。端侧深度学习的机会更多,挑战也更大。最近,在之前移动端预测引擎的基础上,百度飞桨发布了Paddle-Lite,旨在通过高扩展性架构支持更多硬件平台,提供更高性能的计算,目前还有很多工作要做。可以预见,未来会有更多的端侧AI应用走进我们的生活,这将是非常激动人心的。
期待永会对Paddle-Lite做出更多的贡献,当然也期待永会有更多的技术心得和大家分享。
于佃海
百度深度学习平台飞桨总架构师
前言
深度学习技术在近两年飞速发展,对互联网的诸多方面产生了影响。各种互联网产品都争相应用深度学习技术,这将进一步影响人们的生活。随着移动设备被广泛使用,在移动互联网产品中应用深度学习和神经网络技术已经成为必然趋势。
一直以来,由于技术门槛和硬件条件的限制,在移动端应用深度学习的成功案例不多。传统移动端UI工程师在编写神经网络代码时,可以查阅的移动端深度学习资料也很少。而另一方面,时下的互联网竞争又颇为激烈,率先将深度学习技术在移动端应用起来,可以取得先发制人的优势。
移动端设备的运算能力比PC端弱很多。移动端的CPU要将功耗指标维持在很低的水平,这就给性能指标的提升带来了限制。在App中做神经网络运算,会使CPU的运算量猛增。如何协调好用户功耗指标和性能指标就显得至关重要。另外,App的体积限制也是重大考验,如果为了让用户体验一个深度学习功能而要求其下载200MB甚至更大的模型文件,想必用户是不会愉快接受的。这些都是在移动端应用深度学习技术必须解决的问题。
笔者从2015年开始尝试将深度学习技术应用在移动端,在这个过程中遇到的很多问题是关于性能和功耗的,这些问题最终被逐一解决。现在相关项目代码已经在很多App上运行,这些App有日PV达亿级的产品,也有创业期的产品。2017年9月,笔者所带领的团队在GitHub上开源了该项目的全部代码及脚本,项目名称是mobile-deep-learning,希望它在社区的带动下能够得到更好的发展。本书也是以该项目的代码作为示例进行讲解的。
我们已经在多个重要会议上分享了该方向的成果,听众非常感兴趣,会后和我们讨论了很多问题,我也感觉到这些成果值得分享给更多人,于是产生了撰写本书的想法。
目前,国内外已经有很多关于深度学习的书籍,其中一些对算法的讲述非常精辟且有深度。然而这些书籍基本上都是介绍如何在服务器端使用深度学习技术的,针对在移动端应用深度学习技术的书籍还相对较少。
本书内容
本书力求系统而全面地描绘移动端深度学习技术的实践细节和全景,对iOS和Android两个平台的神经网络实践都会详细讲述。需求不同的读者可以根据自己的情况有重点地阅读。精妙的算法必须加上良好的工业实现,才能给用户提供极致的体验,本书以代码实现为主线讲述工程实践,由浅入深,逐步增加难度,最终会将体系结构和汇编知识应用到实践案例中。
这里需要说明两点:
l笔者将书中出现的Paddle-Lite代码压缩并放到了博文视点的官网,读者可以扫描“读者服务”中的二维码查看。如果想体验最新版本的Paddle-Lite,可以直接到GitHub上搜索查看。
l笔者将书中的链接列在表格中并放在了博文视点的官网,读者同样可以扫描“读者服务”中的二维码查看表格,并点击其中的链接直接访问。
本书可以作为移动端研发工程师的前沿读物,读者阅读本书后,完全可以将所学知识应用到自己的产品中去;同时本书也适合对移动端运算领域感兴趣的朋友阅读。
致谢
特别感谢我的同事在本书编写过程中提供的巨大帮助,由于本书涉猎的技术方向较广——从体系结构到框架程序设计,从CPU到GPU编程,所以有些内容请教了在相关方向更资深的同事。感谢赵家英和秦雨两位同事对CPU性能优化部分提供的帮助,感谢刘瑞龙和谢柏渊两位同事对深度学习框架和GPU部分提供的帮助,有了你们的帮助,本书的内容才更完善、有深度,在此深表谢意。
李永会
2019年7月于北京
第1章初窥移动端深度学习技术的应用1
1.1本书示例代码简介1
1.1.1安装编译好的文件1
1.1.2在DemoApp中应用神经网络技术2
1.2移动端主体检测和分类2
1.3在线上产品中以“云+端计算”的方式应用深度学习技术4
1.4在移动端应用深度学习技术的业界案例6
1.4.1植物花卉识别6
1.4.2奇妙的风格化效果7
1.4.3视频主体检测技术在App中的应用7
1.5在移动端应用深度学习技术的难点8
1.5.1在服务器端和移动端应用深度学习技术的难点对比8
1.5.2实现AR实时翻译功能9
1.6编译运行深度学习App12
1.6.1mobile-deep-learning项目环境简介12
1.6.2mobile-deep-learning项目整体代码结构13
1.6.3mobile-deep-learning通用环境依赖14
1.7在iOS平台上搭建深度学习框架15
1.7.1在iOS平台上搭建mobile-deep-learning项目15
1.7.2在OSX平台上编译mobile-deep-learning项目16
1.7.3iOS平台上mobile-deep-learning项目的Demo代码结构17
1.8在Android平台上搭建深度学习框架18
1.8.1Android平台上mobile-deep-learning项目的环境依赖18
1.8.2Android平台上mobile-deep-learning项目的Demo代码结构19
1.8.3用Paddle-Lite框架编译与开发Android应用20
1.8.4开发一个基于移动端深度学习框架的AndroidApp22
第2章以几何方式理解线性代数基础知识32
2.1线性代数基础32
2.1.1标准平面直角坐标系32
2.1.2改变坐标系的基向量34
2.2向量的几何意义35
2.2.1向量的加减运算36
2.2.2向量的数乘运算37
2.3线性组合的几何意义38
2.4线性空间40
2.5矩阵和变换41
2.6矩阵乘法43
2.7行列式46
2.8矩阵的逆48
2.9秩49
2.10零空间50
2.11点积和叉积的几何表示与含义51
2.11.1点积的几何意义51
2.11.2叉积的几何意义52
2.12线性代数的特征概念53
2.13抽象向量空间54
第3章什么是机器学习和卷积神经网络56
3.1移动端机器学习的全过程56
3.2预测过程57
3.3数学表达59
3.3.1预测过程涉及的数学公式59
3.3.2训练过程涉及的数学公式60
3.4神经元和神经网络61
3.4.1神经元61
3.4.2神经网络63
3.5卷积神经网络63
3.6图像卷积效果65
3.6.1从全局了解视觉相关的神经网络65
3.6.2卷积核和矩阵乘法的关系66
3.6.3多通道卷积核的应用69
3.7卷积后的图片效果70
3.8卷积相关的两个重要概念:padding和stride75
3.8.1让卷积核“出界”:padding75
3.8.2让卷积核“跳跃”:stride75
3.9卷积后的降维操作:池化76
3.10卷积的重要性77
第4章移动端常见网络结构78
4.1早期的卷积神经网络78
4.2AlexNet网络结构79
4.3GoogLeNet网络结构79
4.3.1模型体积问题80
4.3.2计算量问题80
4.4尝试在App中运行GoogLeNet81
4.4.1将32位float参数转化为8位int参数以降低传输量82
4.4.2将CPU版本服务器端框架移植到移动端83
4.4.3应用在产品中的效果84
4.5轻量化模型SqueezeNet85
4.5.1SqueezeNet的优化策略85
4.5.2fire模块86
4.5.3SqueezeNet的全局86
4.6轻量高性能的MobileNet88
4.6.1什么是深度可分离卷积(DepthwiseSeparableConvolution)88
4.6.2MobileNetv1网络结构89
4.6.3MobileNetv2网络结构91
4.7移动端神经网络模型的优化方向92
第5章ARMCPU组成94
5.1现代计算机与ARMCPU架构的现状94
5.1.1冯?诺依曼计算机的基本结构94
5.1.2移动计算设备的分工96
5.2简单的CPU模型98
5.2.1取指过程98
5.2.2译码过程99
5.2.3执行过程100
5.2.4回写过程101
5.2.5细化分工:流水线技术102
5.3汇编指令初探102
5.3.1汇编语言程序的第一行102
5.3.2这些指令是什么105
5.4汇编指令概况106
5.4.1ARMCPU家族106
5.4.2ARMv7-A处理器架构107
5.4.3ARMv7汇编指令介绍109
5.5ARM指令集架构111
5.6ARM手机芯片的现状与格局113
第6章存储金字塔与ARM汇编115
6.1ARMCPU的完整结构115
6.2存储设备的金字塔结构117
6.3ARM芯片的缓存设计原理119
6.3.1缓存的基本理解119
6.3.2简单的缓存映射结构:直接映射121
6.3.3灵活高效的缓存结构:组相联映射123
6.3.4利用一个简单的公式优化访存性能125
6.4ARM汇编知识126
6.4.1ARM汇编数据类型和寄存器127
6.4.2ARM指令集130
6.4.3ARM汇编的内存操作131
6.5NEON汇编指令133
6.5.1NEON寄存器与指令类型134
6.5.2NEON存储操作指令135
6.5.3NEON通用数据操作指令137
6.5.4NEON通用算术操作指令138
6.5.5NEON乘法指令139
6.5.6运用NEON指令计算矩阵乘法140
第7章移动端CPU预测性能优化142
7.1工具及体积优化142
7.1.1工具使用143
7.1.2模型体积优化148
7.1.3深度学习库文件体积优化149
7.2CPU高性能通用优化150
7.2.1编译选项优化150
7.2.2内存性能和耗电量优化151
7.2.3循环展开153
7.2.4并行优化与流水线重排154
7.3卷积性能优化方式157
7.3.1滑窗卷积和GEMM性能对比157
7.3.2基于Winograd算法进行卷积性能优化160
7.3.3快速傅里叶变换162
7.3.4卷积计算基本优化163
7.4开发问题与经验总结164
第8章移动端GPU编程及深度学习框架落地实践166
8.1异构计算编程框架OpenCL166
8.1.1开发移动端GPU应用程序167
8.1.2OpenCL中的一些概念168
8.2移动端视觉搜索研发169
8.2.1初次探索移动端AI能力170
8.2.2取消拍照按钮,提升视觉搜索体验171
8.2.3使用深度学习技术提速视觉搜索172
8.2.4通过AI工程技术提升视觉搜索体验174
8.3解决历史问题:研发Paddle-Lite框架176
8.3.1体积压缩178
8.3.2工程结构编码前重新设计178
8.3.3视觉搜索的高级形态:实时视频流式搜索184