对于AI视觉应用,最复杂和耗费大量研发资源的还是软件的算法实现和优化,这也是本文的重点所在。
通过实现和优化了i.MX8M上的人脸识别应用,我们在不依赖于任何神经元网络硬件加速的情况下,达到了非常流畅的识别帧率,就开始莫名的自我感觉良好,非常乐观的通过简单的线性换算(1.5GHz x 4核)就开始盘算着理论上在i.MX RT(600MHz单核))上能得到如何的性能,虽然我们也清楚的知道MPU使用的Arm Cortex-A可以在代码中使用NEON指令加速和OpenMP实现任务并行和数据并行,并且MPU具有一级缓存和大容量的二级缓存。
在埋头苦干了一段时间后终于丑陋的实现了MCU上的人脸识别运算,然而结果非常失望,仅仅识别一张人脸数据的时间就达到了9.8秒!这个大大超出了我们的预期,这样的性能完全无法进行商用,想不到单核MCU和多核MPU的单位频率的算力差距竟然是如此之大!
但我们并不会就此放弃(否则也不会有这篇文章的问世)。码农们在冷静下来之后提出了很多创新性的优化方案,基本上围绕两个方面进行展开:
人脸识别AI模型的优化
端侧前向推导引擎代码的优化
也就是说攻城狮们必须要扮演两个角色,一是继续做好程序猿,二是成为出色的训魔师,码农参农得样样行。
特别需要感谢老板的鼎力支持和他独到的技术眼光(不是拍马屁哦,他不懂中文),以及恩智浦IT部门的强力支持,我们以最快的速度买到了高性能GPU服务器,原来需要4周完成的一次模型训练现在只需要2天,这样我们就可以很任性的、愉快的进行参数调整和模型训练。如果不采用高性能GPU的话,训练参数的batch size无法设的很大,导致模型很难快速收敛,最终导致模型的精度不会太高,模型的优劣最后不就是那百分之零点几吗?