【嵌入式AI】深度学习推理优化原理

深度学习编程理论

命令式编程(动态图)

在这里插入图片描述

声明式编程(静态图)

在这里插入图片描述

模型转换

计算图转换

动态图便于调试,适用于模型构建训练阶段;静态图执行高效,节省模型推理时间
动态图转换为静态图的两种方法:基于追踪转换、基于源码转换
在这里插入图片描述

目标格式转换

利用onnx
在这里插入图片描述

深度学习推理优化原理

相比于训练阶段,深度学习模型推理阶段的计算流程相对固定,有更多的优化空间

计算图优化

计算图优化不涉及具体的硬件平台,主要从内存管理、内核调用、数据同步等方面进行计算图优化

优化内存分配方式:静态内存分配

在进行深度学习模型推理计算时,模型参数、输入输出数据、中间表示都需要大量的存储空间、为了避免每次推理之前都重新分配存储空间,一般的做法是再推理任务开始之前为每个节点的输入和输出以及模型参数的形状开辟存储空间,多次推理复用同一空间

指定合适的批量大小:较小的批量大小不能充分发挥硬件的计算资源,批量太大又会收到内存带宽的限制

较小的批量大小不能充分发挥硬件的计算资源,比如昇腾处理器的矩阵运算大小为16*16,如果批量过小,就会浪费计算资源。而批量过大,计算性能峰值往往会受限于内存带宽,也就是说会花费大量的时间在内存搬运上,从而造成过高的延迟。

精细的内存管理实现内存复用:减少额外的内存搬移

复杂的网络结构增加了计算图的复杂性,可以通过精细的内存管理来消除这些操作,以Inception举例,上一层的数据需要同时作为四个算子的输入,一方面四个算子的输入可以共用上一层输出的内存,另一方面四个算子的输出可以通过精确的内存计算分别指向输出层的不铜位置,计算完成后不需要额外的内存搬移
在这里插入图片描述

尽可能消除模型中的控制逻辑

控制逻辑的存在会引入复杂的内核调度和内核管理,因此应该尽可能减少控制流

合理使用模型中的并行计算:不存在数据依赖的算子可并行计算

通过一个同步算子同步数据,可以大大降低延迟

内核融合:多个内核函数融合成一个,减少内核调用和内存搬运

在这里插入图片描述

内核函数优化

内核函数优化涉及具体的硬件架构、存储层次结构以及不同的并行方式,主要采用数据排布优化、循环展开、数据变化等方式优化

循环展开和矩阵分块:充分利用硬件计算资源的并行度

GPU能把在CPU上一个循环完成的运算通过并行计算的方式用一次运算完成
实际的硬件支持的并行程度有限,比如昇腾最大支持16*16的矩阵乘法,要对矩阵进行分块以适配具体硬件的运算能力

在这里插入图片描述

优化数据的存储顺序:不同的存储顺序会导致数据的访问特性不一致

NCHW同一通道的所有像素顺序存储,因此只有等到每个通道的所有像素都和对应的因子相乘后才能累加,需要占用较大的临时空间,这种存储顺序适合在CPU上访问
NHWC不同通道的同一位置像素值顺序存储,因此多个像素组可以通过组内计算直接获得像素值,拼接后就能获得最终结果。在GPU上多组像素能并行执行,临时空间要求较小。
在这里插入图片描述

专用内核:硬件不支持的算子,需要自定义或者通过子图变换来实现

在一些特定的硬件上,IR中计算节点没有直接对应的硬件算子,只能通过子图的变换来达到子图中所有算子在对应的硬件上的存在。例如在MindSpore中,昇腾芯片上的Concat算子,只支持有限的输入个数(63个),因此当前端IR上的输入个数大于限制输入的时候,需要将该计算节点拆分成等价的多个Concat节点, 当Concat有100个输入时,单个算子只支持最多63个输入,此时会将该计算节点拆分成两个Concat节点,分别为63个输入和37个输入的两个算子。
在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值