0、背景
oneDNN是Intel开源的深度学习加速库,其前身为MKLDNN,对于Intel自家硬件(CPU以及GPU),oneDNN对神经网络算子的计算过程进行了针对性的优化处理,从而显著提升了神经网络算子在Intel硬件下的计算速度。在训练侧,oneDNN已作为第三方工具被目前几乎所有的主流训练框架(TensorFlow、PyTorch、MXNet等)集成;在推理侧,其是OpenVINO的后端,并也经常作为第三方推理加速库被其它工程调用。在下文中,我们将会以ResNet50模型为例,通过直接使用oneDNN API搭建该模型,并增加一些推理加速优化策略,最终实现与OpenVINO几乎相同的推理速度。
一、搭建ResNet50模型
在使用oneDNN搭建ResNet50网络模型时,我们需要熟悉oneDNN开发者手册中每一个算子的性能注意事项,并在编写代码时严格遵守,如:
- 在搭建卷积以及全连接算子时,需要将其输入、权重以及输出的内存排布格式设置为dnnl::memory::format_tag::any,以使oneDNN根据运行环境CPU所支持的指令集情况决定最佳的内存排布;
- 搭建ReLU、Softmax、Sum等in-place算子时,其算子输入输出内存地址应该相同;
- 搭建Sum算子时,需要保证算子输入的内存排布格式相同等。
二、推理加速优化策略
2.1. Conv+BN+ReLU算子融合
在深度学习模型编译器中,将卷积层与BN层进行融合已是固定技巧,其思想也非常简单。在算子未融合时,卷积层与BN层的整体表达式