在对 C++ 版本的 resnet50 经过大约 5 个版本的优化之后,性能也基本达到了预期。至少利用手写的 resnet50 在 CPU 上推理一张图片感觉不到卡顿了。
下面对这几个版本的性能优化做一个总结。
初始版本1
第一版本的 C++ 代码,并没有考虑性能问题,仅仅是想按照手写 resnet50 的想法,先将功能实现,并且确保手写的模型精度没问题,可以正确推理出一张图片。
作为一个基线版本,第一版也是耗费精力最大的一个版本,经过大量的调试之后,终于将模型的精度稳定在了一个可接受的范围内,在我的虚拟机上(基于 Intel CPU)测试了第一版本的性能数据为:
上面是测试了10几张图片的推理性能数据,平均推理一张图片延时为 17s,这个时间肯定是不行的。试想一下,假设人脸识别要等 17 s才能识别出来,使用者会是什么感受。
于是开启了后续几轮性能优化,每一轮优化都是在前面的基础上进行的。
优化版本2
本次优化重点是对卷积的乘累加操作进行的向量化,利用的是 Intel AVX2 指令集进行,将乘法和加法向量化,从而提升了卷积计算的速度,本次优化后,在相同的平台上测试,性能数据为: