NCCL 源码阅读笔记
最近简单读了一下NVIDIA Collective Communications Library (NCCL, pronounced “Nickel”) 的源代码。现将初步的一些收获总结一下。
Life is Brilliant.
最近简单读了一下NVIDIA Collective Communications Library (NCCL, pronounced “Nickel”) 的源代码。现将初步的一些收获总结一下。
这一周主要是看论文,浏览了今年MLSys,ASPLOS以及去年SOSP和前年OSDI上与系统和机器学习相关的文章,重点阅读了一些与深度学习的性能提升相关的文章。受到之前包老师推荐阅读的文章(There’s plenty of room at the Top)的影响,我把这些文章分为三类,分别是Algorithm、Software和Hardware Architecture。由于我关注的这些会议都是偏系统的,所以Software层面的文章比较多。
最近调研了一些GPU性能模型相关的文章。这些模型关注通用场景下GPU kernel的运算性能,往往将GPU kernel看做一个黑盒子(而事实也确实如此),通过benchmark以及profiling tools给出的一些信息,来对kernel的运行时间进行预测。
同时,在另一方面,为了能深入理解程序员对CUDA kernel的优化过程,我也阅读了NVIDIA提供的CUDA Best Practices Guide[1]。直接从程序员编写CUDA代码的角度来理解CUDA kernel可能存在的一些特性。
现在将这两部分内容做一些整理和总结,从两个角度来对GPU kernel的性能进行分析。
GPU架构
NVIDIA GPU包含多个Stream Multiprocessor(SM)。每个SM的结构如上图所示,其中包含多个Stream Processor(SP)以及数个Special Function Units (SFU),SP是GPU的基本算术指令执行单元,SFU则用于执行一些复杂的操作,例如sin,cos等。除此之外,SM还包含一个几十KB大小的Shared-Memory、一个Instruction Cache和Data Cache,以及一个Multithreading issuing unit用于指令的调度。
我选择的20篇文章主要关注分布式系统,以及分布式系统在机器学习中的应用。分布式系统是计算机科学历史悠久的一个研究方向,设计一个分布式系统需要考虑许多方面的因素,例如进程的交互与通信协议、故障处理及容错机制、数据复制及一致性等。经过学界多年的研究,针对这些问题,已经有了比较好的解决方案。而在当下,机器学习正迅速发展,越来越多的数据以及规模越来越大的模型,都使得在分布式环境中训练机器学习模型成为一大主流趋势。如何针对机器学习应用设计分布式系统,从而加速机器学习应用的训练过程,成为现在研究的热潮。2018年在斯坦福举行的全新学术会议SysML,就着眼于机器学习和系统这个交叉学科,使得这个领域受到越来越多的关注。通过这次的文献阅读,我们将会看到,适用于机器学习的分布式系统与传统的分布式系统有许多内在关联,但同时,机器学习应用的一些内在特点使其不同于传统的并行程序,如何针对机器学习应用的特点设计分布式系统,充满了新的挑战。
由于神经网络的规模越来越大,单个计算设备往往难以在短时间内完成对整个网络的训练,因此出现了大量的分布式神经网络训练方案,利用多个节点的计算能力加速训练过程。 而计算设备也在不断更新,可以是CPU、GPU以及TPU等更多类型的硬件。
为什么按一下键盘,PPT会翻一页?
按一下键盘,键盘会产生一个信号送到南桥芯片,南桥芯片把键盘的编码保存在一个寄存器中,并向处理器发送一个外部中断信号。