GPU|干货|基于 CPU 的深度学习推理部署优化实践( 二 )


GPU|干货|基于 CPU 的深度学习推理部署优化实践文章插图
图 5. 深度学习服务性能指标
2. 基于 CPU 的深度学习推理服务优化2.1 CPU 上进行深度学习优化的方法主要有哪些?
“工欲善其事 , 必先利其器” 。 CPU 上进行深度学习推理服务优化的方法 , 可以分为系统级、应用级、算法级 , 每一级也有对应的性能分析工具 , 如图 6 所示:
系统级的优化主要从硬件和平台的角度进行计算加速 , 方法主要包括基于 SIMD 指令集的编译器加速、基于 OMP 的数学库并行计算加速、以及硬件厂商提供的深度学习加速 SDK 等方法 。
应用级的优化主要从特定应用和服务的角度进行流水和并发的优化 。 通常的深度学习服务不仅仅包含推理 , 还有数据的预处理、后处理 , 网络的请求响应等环节 , 良好的并发设计可以有效的提升服务端到端的性能 。
算法级的优化主要针对深度学习模型本身 , 利用诸如超参数设置、网络结构裁剪、量化等方法来减小模型大小和计算量 , 从而加速推理过程 。
GPU|干货|基于 CPU 的深度学习推理部署优化实践文章插图
图 6. 深度学习服务性能优化方法及分析工具
2.2 如何进行系统级的优化?
CPU 上系统级优化实践中我们主要采用数学库优化(基于 MKL-DNN)和深度学习推理 SDK 优化(Intel OpenVINO)两种方式 。 这两种方式均包含了 SIMD 指令集的加速 。
数学库优化对主流的深度学习框架(tensorflow , caffe , mxnet , pytorch 等)均有官方源支持 。 以 tensorflow 为例 , 使用方法如下所示:
GPU|干货|基于 CPU 的深度学习推理部署优化实践文章插图
图 7. 基于 MKL-DNN 优化的 Tensorflow 使用方法
深度学习推理 SDK 优化方法 , 需要首先将原生深度学习模型进行转换 , 生成 IR 中间模型格式 , 之后调用 SDK 的接口进行模型加载和推理服务封装 。 具体流程如下所示:
GPU|干货|基于 CPU 的深度学习推理部署优化实践文章插图
图 8. OpenVINO 优化推理服务流程
2.3 选用哪种系统级优化方式?
两种优化方式的比较如图 9 所示:
GPU|干货|基于 CPU 的深度学习推理部署优化实践文章插图
图 9. 系统级优化方式比较
基于两种优化方式的特点 , 实践中可首先使用基于 MKL-DNN 的优化方式进行服务性能测试 , 如满足服务需求 , 可直接部署;对于性能有更高要求的服务 , 可尝试进行 OpenVINO SDK 优化的方法 。
2.4 系统级优化使用中有哪些影响性能的因素?
以上两种系统级优化方法 , 使用过程中有以下因素会影响服务性能 。
(1)OpenMP 参数的设置
两种推理优化方式均使用了基于 OMP 的并行计算加速 , 因此 OMP 参数的配置对性能有较大的影响 。 主要参数的推荐配置如下所示:
? OMP_NUM_THREADS = “number of cpu cores in container”
? KMP_BLOCKTIME = 10
? KMP_AFFINITY=granularity=fine, verbose, compact,1,0
(2)部署服务的 CPU 核数对性能的影响
CPU 核数对推理服务性能的影响主要是:
? Batchsize 较小时(例如在线类服务) , CPU 核数增加对推理吞吐量提升逐渐减弱 , 实践中根据不同模型推荐 8-16 核 CPU 进行服务部署;
? Batchsize 较大时(例如离线类服务) , 推理吞吐量可随 CPU 核数增加呈线性增长 , 实践中推荐使用大于 20 核 CPU 进行服务部署;
(3)CPU 型号对性能的影响
不同型号的 CPU 对推理服务的性能加速也不相同 , 主要取决于 CPU 中 SIMD 指令集 。 例如相同核数的 Xeon Gold 6148 的平均推理性能是 Xeon E5-2650 v4 的 2 倍左右 , 主要是由于 6148 SIMD 指令集由 avx2 升级为 avx-512 。


推荐阅读