做AI这么轻松吗?因为百度飞桨技术力又飙升了( 三 )


降低硬件适配成本:三大自研优化方案
硬件适配是开发者使用深度学习框架开发应用时可能会遇到的头疼问题之一 。 随着智能芯片种类的日益复杂 , 适配成本显然已经成为一个重大问题 。
为了开发者适配硬件时有更多选择 , 飞桨一直在努力 。 在WAVESUMMIT2020峰会上公布了飞桨硬件生态伙伴圈 , 通过与全球芯片、整机等相关硬件领导厂商的密切合作 , 积极适配芯片或IP 。 但应看到 , 基于技术创新降低硬件的接入成本同样重要 。
因此 , 百度在峰会上正式推出了硬件适配统一方案 , 这是一种多层次、低成本的硬件适配方案 , 包括飞桨三大自研优化方案:KernelPrimitiveAPI、NNAdapter和神经网络编译器CINN(预发布版本) , 分别提供了算子开发与映射、子图与整图接入以及编译器后端接入三类互相关联的方案 , 灵活性十足 。
做AI这么轻松吗?因为百度飞桨技术力又飙升了
文章图片
首先看KernelPrimitiveAPI 。 通过对算子Kernel实现中的底层代码进行抽象与封装 , 提供高性能的Block级IO和Compute运算 , 实现了算子计算与硬件解耦 。 这样一来 , Kernel开发可以更加专注计算逻辑的实现 , 在保证性能的同时大幅减少代码量 , 如softmax算子实现由155行减少为30行 , 逻辑更加清晰 , 可维护性更高 。
该方案还能够大幅减少硬件适配时的算子开发成本 , 以昆仑芯2接入为例 , 通过KernelPrimitiveAPI组合实现Reduce、Elementwise和Activation这三类算子 , 适配代码量减少93.4% 。 使用KernelPrimitiveAPI还实现了一处优化、多处收益的效果 , 仅对IO运算进行向量化访存优化 , 飞桨的70个算子性能就可以平均提升12.8% 。
做AI这么轻松吗?因为百度飞桨技术力又飙升了
文章图片
其次是NNAdapter 。 我们知道 , 硬件厂商通过直接子图/整图接入时 , 需要理解框架的内部实现机制 , 门槛高且沟通成本大 。 飞桨在框架和硬件之间建立了NNAdapter统一适配层 , 向上通过NNAdapterAPI完成框架适配层的统一接口 , 向下通过NNAdapterHAL完成硬件抽象层(HAL)的统一接口 , 实现了对硬件设备的抽象和封装 , 为NNAdapter在不同硬件设备提供统一的访问接口 。
这一方案实现了算子定义及框架调度执行与硬件的解耦 , 降低了门槛 , 减少了成本 。 以寒武纪MLU适配为例 , NNAdapter方案相比原直接子图接入方案 , 代码行数减少69.4% , 修改的代码文件减少62.3% , 人力投入成本降低60% 。
做AI这么轻松吗?因为百度飞桨技术力又飙升了
文章图片
最后是预发布版本的神经网络编译器CINN 。 CINN全称为CompilerInfrastructureforNeuralNetworks , 面向飞桨框架深度优化 , 同时支持训练和推理 。
做AI这么轻松吗?因为百度飞桨技术力又飙升了
文章图片
在硬件适配时 , 大量复杂算子需要利用硬件提供的特定基础计算库实现 , 这些复杂算子与硬件的基础计算库差别较大 , 导致了适配成本很高 。
CINN将复杂算子拆分成基础算子组合实现 , 使得适配时只需实现少量基础算子即可完成对各种复杂算子的支持 , 并且这些基础算子与硬件计算库更接近 , 因此实现成本更低 。 然后 , 再通过自动融合及自动代码生成技术 , 解决kernel增多带来的调度和访存开销 , 提升性能 。
CINN编译器方案能带来多大的提升呢?马艳军举例表示 , 「在这次预发布的CINN版本中 , ResNet50模型的训练性能已持平手工极致优化水平 。 」
做AI这么轻松吗?因为百度飞桨技术力又飙升了