论文部分内容阅读
随着深度学习在各个领域的普及,神经网络参数的规模越来越大,训练的周期也越来越长,多GPU加速成了必然的硬件解决方案。为了最大化多GPU的硬件利用率,本文研究和实现了深度学习的GPU优化策略,包括单机单卡和多机多卡方案。本文在单机单卡方面的主要工作与贡献包括:单机单卡方面,本文详细地介绍了神经网络常用结构以及加速细节,维护了名为"CUDA-CNN"的开源项目。该项目已经支持包括卷积层,池化层,Softmax层,分支层,合并层,NIN层,Inception层以及多种数据扩展方法等。此外,该项目在MNIST数据集上取得公开结果中最高的准确率99.81%。本文在多机多卡方面的主要工作与贡献包括:首先,主要研究如何提高系统的负载均衡能力以及减少并行开销。通过实验证明,在单位时间内,每个GPU分别迭代fetchi次后,再将残差和汇总到参数服务器,这种方法除了减少通信频率之外,又能够根据GPU的计算能力分配不同的规模的任务,提高了系统的负载均衡能力。此外,本文引入了热启动技术,通过动态的修改参数同步频率,有效地提高了训练前期的收敛速度。其次,详细设计了多机卡的任务调度器。首先,为了避免人为分析程序并行性所带来的遗漏或者错误风险,本文沿用Purine中的二分图技术。由于二分图中包含了所有操作之间的数据依赖关系信息,调度器可以自动分析任务的并行性,最大化异步操作:其次,为了减少并行开销,本文在调度器中引入线程池和任务队列,将使用同类型硬件的计算任务放在同一个线程池或者任务队列中,有效地减少了线程的创建和销毁频率,减少由资源竞争引起的并行开销。最后,通过引入CUDA的事件机制来支持调度器的同步操作。最后,实验表明,在单机多卡环境中, Npruine性能比Purine提高了23.7%,与此同时,两个计算能力不相同的GPU利用率都达到96%左右。此外,Purine在使用四个节点的集群上,性能不但没有增加,反而仅是单个节点性能表现的47%。经过优化和改进,新架构Npurine能够在廉价网络连接的集群上运行,其性能是Purine的12.34倍。