Page 42 - 《软件学报》2020年第9期
P. 42
张政馗 等:面向实时应用的深度学习研究综述 2663
在不同时间段运行所测量的运行时间会有较显著的差异.通过 GPU 驱动所提供的接口可锁定 GPU 的运行频率
为 GPU BIOS(basic input output system)中的预设频率,从而让 GPU 程序的运行时间保持恒定.但是当 GPU 温度
超过最高工作温度阈值时,GPU 的硬件保护机制仍然会自动强制 GPU 降低工作频率.因此,当在 GPU 上运行实
时任务时,需要在初始化时锁定 GPU 的工作频率.在散热能力有限的情况下,要特别注意 GPU 任务负载的调度,
避免 GPU 长时间处于高负荷工作状态而产出高热,并引发 GPU 自动降频.GPU 的自动降频可能会导致实时系
统调度严重失效,引发灾难性后果.
3 DNN 任务性能分析与优化
DNN 任务性能分析与优化的重点在于分析 DNN 任务的性能特性,基于系统瓶颈提出相关优化策略.现有
研究工作旨在提升网络执行的平均性能.但遗憾的是,当前研究工作并没有把网络实时性纳入考虑范畴.在实时
系统中仅考虑平均性能而不考虑实时性能,是无法满足安全攸关实时系统的要求的,这是实时系统中亟待解决
的问题,也是未来研究的重点和难点.本节就 DNN 任务平均性能方面,首先总结前人在 DNN 任务性能分析方面
的主要工作,综合阐述了 DNN 任务性能分析方法以及现有系统的瓶颈;然后,从轻量化网络角度阐述了 DNN 网
络的性能优化工作;最后,在 DNN 任务实时性能方面,整理了当前实时神经网络的最新进展与成果.
3.1 DNN任务的性能分析
程序的性能分析(performance analysis)指的是通过静态/动态程序分析方法计算/收集程序运行时的性能数
据,用于分析程序的负载特性和性能瓶颈,用户(程序开发者、编译器或者硬件计算平台)根据性能分析提供的反
馈信息综合优化系统整体性能.GPU 作为主要的硬件加速设备,已经被广泛的应用于深度学习领域.DNN 任务
在 GPU 上运行时会遇到各种性能障碍,例如低效的 DNN 算法、低精度的结果、并行的开销、负载的不均衡、
内存缓存和带宽的低效使用、计算延迟超出响应时间要求等.为了识别 DNN 任务在 GPU 上执行时的负载特性
和性能瓶颈,需要进行性能分析.目前,对基于 GPU 的 DNN 任务进行性能分析可以概括为 3 个发展阶段:
性能分析的第 1 阶段是借助性能分析工具,基于实验测试的方式获取 DNN 任务的性能数据.基于特定的
GPU 目标硬件平台,选取特定的深度学习框架或 DNN 算法,采用实验的手段,结合 NVIDIA 官方提供的性能分
析工具(例如 nvprof,NVVP,Nsight)读取 GPU 上有限的硬件计数器获取程序运行时间、资源利用等性能数据.
Kim 等学者 [45] 通过实验的手段分析了同一种 DNN 网络模型在 5 种流行的深度学习框架(Tensorflow,Caffe,
Torch,CNTK,Theano)上的性能差异,他们基于 DNN 模型的每一层(layer)的前向/后向传播进行“端到端”的测量,
获取每一层操作的执行时间和资源占用情况,识别每种框架下的 DNN 任务的“Hot Layer”(指计算量大、耗时长、
消耗资源多的层).此外,Shams 与 Platania 等学者在文献[56]中,通过对不同的高性能计算硬件环境(NVLink,
Knsight Landing)进行测量评估,比较了 Caffe,TensorFlow 与 Apache SINGA 在运行速度与可扩展性等方面的性
能差异.虽然该研究工作揭示了不同深度学习框架或 DNN 算法之间存在着性能差异的客观事实,但是却没有揭
示导致差异的本质原因.为探究 DNN 任务在特定 GPU 硬件平台上的工作性能,Mojumder 等学者基于 NVIDIA
DGX-1 多 GPU 系统开展了一些研究工作 [57] .他们选取了 GoogleNet,AlexNet 等图像分类应用中 5 种典型的网
络模型,在 DGX-1 系统中进行训练,对网络训练过程中的各个阶段的训练时间进行获取和分析,探究 DNN 模型
在训练阶段的时间行为特性.该阶段的研究工作旨在通过基础的实验测量手段获取性能数据,用于识别 DNN 的
负载特性和性能瓶颈,辅助程序开发人员或者 DNN 模型的设计人员设计出高效的 DNN 的训练和推理方法.但
由于实验手段与性能工具的局限性,获取得到的性能数据和性能分析结果也存在着一定的局限性.
性能分析的第 2 阶段是采用程序插桩的方法获取细粒度的性能数据.基于 GPU 硬件平台,结合编译器和程
序插桩方法,获取细粒度的性能数据,并基于分析结果进行 DNN 任务的优化工作.Stephenson 等学者在文献[58]
中提出了一种基于后台编译的插桩工具 SASSI,该工具允许用户指定用于插桩的指令代码,自定义插桩位置和
插桩内容,相对于其他插桩工具更加灵活.SASSI 内置于 NVIDIA GPU 的编译器中,对 PTX 代码进行插桩,实现
对待检测程序的控制流行为、访存行为以及程序执行过程中的寄存器状态进行性能数据获取和分析.Du Shen
等学者提出了 CUDAAdvisor 性能分析框架 [59] ,旨在对现代 GPU 上的代码优化提供指导作用.该工具利用