阿里云「飞天发布时刻」2024来啦!新产品、新特性、新能力、新方案,等你来探~ 了解详情
写点什么

工程之道,深度学习推理性能业界最佳优化实践

  • 2020-06-05
  • 本文字数:4329 字

    阅读完需:约 14 分钟

工程之道,深度学习推理性能业界最佳优化实践

MegEngine“训练推理一体化”的独特范式,通过静态图优化保证模型精度与训练时一致,无缝导入推理侧,再借助工业验证的高效卷积优化技术,打造深度学习推理侧极致加速方案,实现当前业界最快运行速度。

本文从推理侧的数据排布(Inference Layout)讲起,接着介绍 MegEngine 的 Im2col+MatMul、Winograd、Fast-Run 工程优化实践。经典的轻量卷积神经网络实验表明,经过 MegEngine 加速,ResNet18 和 ResNet50 最高加速比可达 2x 以上,ShuffleNet V2 和 MobileNet V2 执行效率也得到显著提升,实现了业界当前最佳推理性能。


深度学习是一个端到端的自动化系统,在数据驱动之下,算法历经训练测试、工程部署、推理实现三个环节。深度学习技术能否最终落地为产品,细粒度满足不同场景需求,深度学习框架的推理性能优化是一个关键变量。


针对不同硬件设备对性能的苛刻要求,业界一般做法是开发一套推理专用框架,不足是造成了训练与推理的分裂。MegEngine(中文名:天元)“训练推理一体化”的独特范式,可以实现训练与推理的精确等价性,避免转换可能带来的精度损失。


MegEngine 的推理性能优化有两个阶段,1)工程部署时的静态图优化,保证模型精度和训练时一致,2)推理实现时的卷积优化,保证模型运算的最快速度。两者最终的优化目标是实现模型推理又“好”又“快”。


深度学习中,卷积种类众多,计算也最为耗时,成为首要优化对象,而推理侧卷积优化更是重中之重。如何让深度学习模型鲁棒运行和推理,即在不同硬件平台(比如 CPU)上,针对目标架构(比如 X86/ARM)做计算优化,实现最快运行速度,是一个长久存在的挑战。


MegEngine 秉持极致的“工程之道”,针对 CPU 推理的卷积优化,做了细致而系统的工程创新,不断逼近加速极限。本文是 MegEngine 卷积优化技术的“综述篇”,基于已有工作,做了多项技术的工程优化,包括 Inference Layout、Im2col+MatMul、Winograd、Fast-Run。后续会有相关技术的详解篇。

Inference Layout

推理侧卷积计算优化方面,首先面临的问题是 feature map 的数据排布(Tensor Layout),选择合适的数据排布不仅会使卷积优化事半功倍,还可作为其他优化方法的基础,比如 Im2col、Winograd、Fast-Run。


目前,深度学习框架中常见的数据排布格式有 3 种:


● NHWC:[Batch, Height, Width, Channels]


● NCHW:[Batch, Channels, Height, Width]


● NCHWX:[Batch, Channels/X, Height, Width, X=4/8]


数据的排布对卷积计算有着整体性的直接影响。NHWC 和 NCHW 的空间复杂度相同,区别在于访存行为,NCHWX 介于两者之间,但是有其他优点。

NCHWX

NCHWX 在 NCHW 的基础上转换而来,其原理可参考下图。



MegEngine 选择 NCHWX 作为 CPU 推理实现的数据排布(Inference Layout),有如下 3 个原因:


● 适配 SIMD 指令,比如 Arm Neon 上,用 4 个浮点数填满一条 SIMD 向量,减少边界判断的次数;


● 对 Cache 更友好,比如计算卷积时读取 feature map,实现多个通道连续访问;


● 易于进行 padding,减少边界分支判断,代码逻辑简单。

Im2col+MatMul

Im2col+MatMul 是一种针对深度神经网络卷积计算的高效实践方法。Im2col(Image to Column)把输入 feature map 按照卷积核的形式一一展开并拼接成列,接着通过高性能 MatMul(Matrix Multiplication) Kernel 进行矩阵乘,得到输出 feature map,具体原理可参考论文[1],它的本质是把卷积运算转换成矩阵运算。


Im2col+MatMul 在做算法创新的同时,也产生了一些新问题:


● Im2col 转换之后,所得数据数倍/数十倍于输入 feature map;


● Im2col 转换之后,数据内存占用超过 L2 Cache,对 Cache 不友好;


● Im2col 转换之后,MatMul 要再操作一次数据 PACK。


针对这些问题,MegEngine 结合自身工业实践,做了两方面的工程优化:1)进行 Im2col+MatMul 分块操作,减少访存缺失;2)融合 Im2col+MatMul 的 PACK 操作,减少数据访存。

分块操作

Im2col+MatMul 优化卷积计算时,比如输出 feature map 的数据格式为 [n, oc, oh, ow],卷积核的大小为 fhfw,那么 Im2col 转换之后的数据格式为 [n, fhfwic, ohow]。MegEngine 的分块操作在 oh*ow 维度上,分块大小通过公式计算,确保 Im2col 之后的数据完全保存于 L2 Cache。



分块之后,不仅可以减少内存占用,还将提升数据访存效率,其原理图如下所示,把 Im2col 转换数据在其 ohow 维度上切块,接着,每个分块和 weight 进行矩阵乘,获取输出 ohow 维度上的一个分块:



为验证分块操作的有效性,MegEngine 开展了相关对比实验,在进行单层卷积计算时,给出了采用 MegEngine Im2col 分块操作前后的内存/性能数据的对比,其中内存占用节省了数十倍,计算性能也显著提升:


融合 PACK

Im2col+MatMul 的 PACK 融合操作将会减少数据访存。具体而言,Im2col 转换之后的数据,在 MatMul 计算时需要一次数据 PACK[3],实际上这对 Im2col 数据做了两次读写,造成了不必要的访存,因此,MegEngine 通过 Im2col+MatMul 的 PACK 融合,减少了一次内存读写。


下面是 Im2col+MatMul 的 PACK 融合优化前后,卷积计算的性能测试对比,个别 Case 最大提升可达 18%:


Winograd

在深度神经网络中,卷积计算占据了绝大部分的时/空复杂度,Im2col+MatMul 可以提高访存友好性,但无益于时间复杂度的减少,因此卷积计算优化实践中诞生了 Winograd 算法,具体数学原理可参见论文[2]。


Winograd 算法主要应用于卷积核为 3x3,步幅为 1 的 2D 卷积神经网络,其参数表示为 F(mxm, rxr),其中 mxm 是运算之后输出块的大小,rxr 是卷积核的大小,以 F(2x2, 3x3)和 F(6x6, 3x3)使用最多,前者加速比可达 2.25x,后者加速比则高达 5.06x [2]。



Winograd 算法的本质是以加法换乘法,其计算优化的一般流程如上图所示(注:出自[3]),可分为 3 步:


● 把输入的 feature map 和 weight 进行矩阵转换;


● 把转换后 feature map 和 weight 做批量矩阵乘;


● 把矩阵乘的结果进行输出转换,得到最终结果。


同时,其优化运算过程也存在 3 点不足:


● 输入转换要计算整个 feature map,数据读写对 Cache 不友好;


● feature map 转换之后,矩阵乘时需要再 PACK,数据访存增加;


● 输出转换读取批量矩阵乘之后结果时,两次连续读写间隔较大,对 Cache 不友好。

工 程

针对上述问题,MegEngine 结合自身多年深度学习实践,对 Winograd 算法的整个计算流程做了工程优化,主要有:


● 输入转换时,分块 feature map 的全部 tiles,随后只计算一个分块的数据;


● 调整分块大小适配 CPU L1 Cache,使得矩阵乘不需要 PACK;


● 结合 NCHWX 数据排布,通过 SIMD 指令优化输入/输出转换。


由此,MegEngine 对整个输入 feature map 进行分块,每次 Winograd 完整流程只计算一个分块的 nr 个 tiles,该分块大小的计算公式为:



即保证每个批量矩阵的输入数据(除了转换之后的 weight 数据)保存于 L1 Cache,则矩阵乘时不 PACK 也不会出现访存缺失。


根据上述公式和 L1 Cache 大小,可计算出 nr_tiles 大小;但是,每个卷积的 ic 不同,最优分块也不同,MegEngine 将通过下文介绍的 Fast-Run 机制做局部搜索,发现最优的分块大小。

实 验

在不同的输入尺寸和算法参数 F=(6x6,3x3)的情况下,原始 Winograd 和 MegEngine 优化后的 Winograd 之间做了加速对比实验,证明后者性能提升效果显著,具体结果如下:


Fast-Run

卷积计算有多种优化实现,侧重点也各有不同,比如 Im2col 可以平衡内存占用和运行速度,Direct 直接进行卷积计算优化,Winograd 则是优化计算复杂度。每种优化实现都在特定的输入参数下有一定的优势,并随着推理平台的不同而发生变化,因此不够灵活,无法选择最优实现。上述实现的启发式偏好如下所示:



为使每个部署模型在运行推理时,最佳地实现每个卷积,MegEngine 从自身工业实践获得启发,通过 Fast-Run 机制进行局部搜索,以改进传统的启发式方法,不遗余力地完善深度学习产品性能。


具体而言,首先,在目标设备上使用目标模型参数搜索所有已实现的算子;接着,记录并保存同时适配目标设备和目标模型的最优算子;最后,在推理时使用最优算子进行计算。


Fast-Run 机制有着较强的自适应性,弥补了启发式机制的一些的缺陷,从根本上确保了目标模型的算子最为适配目标设备,从而发挥出最佳性能。

工 程

Fast-Run 机制的本质是寻找最优算子,其工程实现分为选择和执行两个阶段:


● 选择阶段,测速模型每个算子,选出最优实现,保存算子名称和最优实现的映射表;


● 执行阶段,根据映射表直接调用相应实现完成计算。


实 验

经典卷积网络上的实验测试证明了 Fast-Run 机制的自适应优势,优化效果明显,其模型执行效率优于先验选择下的执行效率,具体结果如下所示:


结 论

深度学习算法在数据的加持之下,迭变权重,更新参数,积累知识,以深度学习产品的方式与这个世界交互。「好而快」是衡量这种交互的不二圭臬。这里,「好」或者精度,对应于静态图优化,「快」或者速度,对应于卷积计算优化,「好而快」是精度和速度的权衡,对应于深度学习框架。


MegEngine“训练推理一体化”有着独特优势,相较推理专用框架,更利于在“好”的基础上做到“快”。通过上文,MegEngine 在一系列经典的轻量级卷积网络上,做了集成式卷积优化实验,ResNet18 和 ResNet50 最高加速比可达 2x 以上,ShuffleNet V2 和 MobileNet V2 执行效率获得大幅提升,实现了当前业界最佳的推理性能。



这些技术将在今年 6 月底发布的 MegEngine Beta 版本中有所体现,敬请期待。下一步,MegEngine 将尝试全局混合 Layout 和混合精度优化,探索更低精度的量化(4bit/1bit),以及采用多级分块适配 CPU 多级 Cache 大小,最大化访存友好性,不断逼近推理侧的加速极限。


了解更多信息可关注:


● MegEngine WebSite:https://megengine.org.cn


● MegEngine GitHub:https://github.com/MegEngine


参考文献:


[1] Kumar Chellapilla, Sidd Puri, Patrice Simard. High Performance Convolutional Neural Networks for Document Processing. Tenth International Workshop on Frontiers in Handwriting Recognition, Université de Rennes 1, Oct 2006, La Baule (France).


[2] Ningning Ma, Xiangyu Zhang, Hai-Tao Zheng, Jian Sun. ShuffleNet V2: Practical Guidelines for Efficient CNN Architecture Design. The European Conference on Computer Vision (ECCV), 2018, pp. 116-131


[3] Lavin, A. and Gray, S. Fast algorithms for convolutional neural networks. In CVPR, 2016.


[4] Feng Shi,Haochen Li,Yuhe Gao,Benjamin Kuschner,Song-Chun Zhu. Sparse Winograd Convolutional neural networks on small-scale systolic arrays. FPGA, Volume abs/1810.01973, 2019, Pages 118


公众号推荐:

跳进 AI 的奇妙世界,一起探索未来工作的新风貌!想要深入了解 AI 如何成为产业创新的新引擎?好奇哪些城市正成为 AI 人才的新磁场?《中国生成式 AI 开发者洞察 2024》由 InfoQ 研究中心精心打造,为你深度解锁生成式 AI 领域的最新开发者动态。无论你是资深研发者,还是对生成式 AI 充满好奇的新手,这份报告都是你不可错过的知识宝典。欢迎大家扫码关注「AI前线」公众号,回复「开发者洞察」领取。

2020-06-05 13:4011384
用户头像
刘燕 InfoQ高级技术编辑

发布了 1112 篇内容, 共 493.5 次阅读, 收获喜欢 1967 次。

关注

评论

发布
暂无评论
发现更多内容

如何修改模型粗糙度增强模型表面粗糙度

3D建模设计

3D模型 粗糙度

OpenHarmony持久化存储UI状态:PersistentStorage

OpenHarmony开发者

OpenHarmony

Elasticsearch Relevance Engine---为AI变革提供高级搜索能力[ES向量搜索、常用配置参数、聚合功能等详解]

汀丶人工智能

ES 向量检索 搜索系统 语义搜索

想让你的代码简洁,试试这个SimpleDateFormat类高深用法

华为云开发者联盟

Java 后端 开发 华为云 华为云开发者联盟

峰会倒计时 3 天!互联网与文娱论坛演讲亮点预告!

SelectDB

数据库 大数据 数据仓库 实时数仓 apache doris

梦幻西游手游详细图文架设教程

echeverra

梦幻西游

腾讯云入选2023 Gartner分布式混合基础设施魔力象限

Geek_2d6073

如何合并模型对象

3D建模设计

模型 3D

浅析“代码可视化” | 京东云技术团队

京东科技开发者

架构 字节码 企业号10月PK榜 代码可视化

选择香港服务器发展线上业务的未来趋势:技术与市场的变化

一只扑棱蛾子

香港服务器

哪家堡垒机支持国密算法?有哪些功能?

行云管家

运维 堡垒机 安全运维 国密浏览器 国密算法

和鲸ModelWhale与中科可控X系列异构加速服务器完成适配认证,搭载海光芯片,构筑AI算力底座

ModelWhale

gpu 服务器 信创 算力 数据科学

对话在行人|九州通:携手用友打造招聘共享中心实现招聘数智化

用友BIP

2023全球商业创新大会 对话在行人

Mac电脑高效音频录制 Piezo 最新 for mac

mac大玩家j

Mac软件 音频录制软件 录音软件

如何按照固定比例缩放模型

3D建模设计

3D模型 等比缩放

深入理解 Netty FastThreadLocal

vivo互联网技术

性能优化 Netty ThreadLocal 内存泄漏 FastThreadLocal

研发日常踩坑-Mysql分页数据重复 | 京东云技术团队

京东科技开发者

MySQL 数据库 分页 企业号10月PK榜

HarmonyOS音频开发指导:使用AVPlayer开发音频播放功能

HarmonyOS开发者

HarmonyOS

万字长文:拆解银行数智运营之困!

京东科技开发者

人工智能 数字化转型 金融 企业号10月PK榜

C4D 2024插件:Arnold for mac(C4D S2024阿诺德渲染器) v4.6.6.1完美激活版

mac

苹果mac Windows软件 Arnold for Cinema 4D C4D R24插件

云计算进入 AI 原生时代

Baidu AICLOUD

大模型 RDMA AI 原生云

正确选择数据库安全运维平台的几个原则-行云管家

行云管家

数据库 数据安全 数据库安全 安全运维

管控变更对提升质量的重要性

老张

质量保障 配置管理

如何给模型换色

3D建模设计

3D模型 颜色 材质

高性能计算与多模态处理的探索之旅:英伟达GH200性能优化与GPT-4V的算力加速未来

蓝海大脑GPU

一款兼容微信抖音支付宝小程序的工具可以直接把小程序搬到自己App

Onegun

小程序 小程序容器

产品需求交付质量保证的“七重门” | 京东云技术团队

京东科技开发者

测试 交付质量 企业号10月PK榜

即刻报名,企业服务与新经济论坛亮点提前揭秘!

SelectDB

数据库 大数据 数据仓库 实时数仓 apache doris

瑞技伙伴 | ZPE 带外管理方案,稳固您的IT世界

Bytebridge

数据中心 带外管理方案 ZPE

即时通讯音视频开发(二十):一文读懂视频的颜色模型转换和色域转换

JackJiang

网络编程 即时通讯 IM

cpu温度监测推荐 Turbo Boost Switcher Pro激活最新版

胖墩儿不胖y

Mac软件 温度监测工具

工程之道,深度学习推理性能业界最佳优化实践_AI&大模型_旷视研究院_InfoQ精选文章