安装好带 MKL-DNN 的 MXNet 之后,我们就可以运行 MXNet 上的模型了。因为 MXNet 使用 MKL-DNN 来加速原有的操作符,所以用户并不需要修改任何代码来提升性能。下面我们用 MXNet 自带的 benchmark 来展示使用 MKL-DNN 加速的 MXNet 在 CPU 上的性能。
mkldnn的作用是为cpu运行网络加速;
mkldnn是intel开发的开源项目,就是针对cpu上运行神经网络做了一些并行优化;但并不是针对所有模型都有效,比如:你跑一个模型,这些指令集应该是会加速一部分操作的速度,但是可能你跑的最耗时的操作并没有被加速,即使一部分速度的提升也看不出效果。比如最耗时的操作要2秒,被加速的指令需要100ms,这样即使快了几倍,最终的时间也没有太大差别。
parser.add_argument('--enable_mkldnn', type=eval, default=True, choices=[True, False],
help='Enable to use mkldnn to speed up when using cpu.')
elif args.device == "cpu":
# set CPU configs accordingly,
# such as enable_mkldnn, set_cpu_math_library_num_threads
config.disable_gpu()
if args.enable_mkldnn:
# cache 10 different shapes for mkldnn to avoid memory leak
config.set_mkldnn_cache_capacity(10)
config.enable_mkldnn()
config.set_cpu_math_library_num_threads(args.cpu_threads)
本文首先对MKL-DNN以及其基本概念进行了简单介绍,随后介绍了三种MKLDNN的推理加速技术,包含卷积计算、分块数据排布与层融合技术,最后通过一个简单的实验,测试了以上推理加速技术并展示了不同技术对推理性能所带来的提升大小。MKLDNN在不同硬件条件下,能够充分利用多种加速技术并针对当前硬件生成优化后的指令集,是非常优秀的推理加速库,也是Adlik自研推理引擎的重要参考之一。学习MKLDNN推理加速设计思路,不仅能够在模型推理方面带来效率的提升,也为其它异构设备的执行优化提供了参考。