NVIDIA英伟达的Multi-GPU多卡通信框架NCCL

笔者注:NCCL 开源项目地址:https://github.com/NVIDIA/nccl

转自:https://www.zhihu.com/question/63219175/answer/206697974

NCCL是Nvidia Collective multi-GPU Communication Library的简称,它是一个实现多GPU的collective communication通信(all-gather, reduce, broadcast)库,Nvidia做了很多优化,以在PCIe、Nvlink、InfiniBand上实现较高的通信速度。

下面分别从以下几个方面来介绍NCCL的特点,包括基本的communication primitive、ring-base collectives、NCCL在单机多卡上以及多机多卡实现、最后分享实际使用NCCL的一些经验。

communication primitive

并行任务的通信一般可以分为Point-to-point communication和Collective communication。P2P通信这种模式只有一个sender和一个receiver,实现起来比较简单。第二种Collective communication包含多个sender多个receiver,一般的通信原语包括broadcast, gather, all-gather, scatter, reduce, all-reduce, reduce-scatter, all-to-all等。简单介绍几个常用的操作:

Reduce:从多个sender那里接收数据,最终combine到一个节点上。

All-reduce:从多个sender那里接收数据,最终combine到每一个节点上。

而传统Collective communication假设通信节点组成的topology是一颗fat tree,如下图所示,这样通信效率最高。但实际的通信topology可能比较复杂,并不是一个fat tree。因此一般用ring-based Collective communication。

ring-base collectives

ring-base collectives将所有的通信节点通过首尾连接形成一个单向环,数据在环上依次传输。以broadcast为例, 假设有4个GPU,GPU0为sender将信息发送给剩下的GPU,按照环的方式依次传输,GPU0–>GPU1–>GPU2–>GPU3,若数据量为N,带宽为B,整个传输时间为(K-1)N/B。时间随着节点数线性增长,不是很高效。

下面把要传输的数据分成S份,每次只传N/S的数据量,传输过程如下所示:

GPU1接收到GPU0的一份数据后,也接着传到环的下个节点,这样以此类推,最后花的时间为 S*(N/S/B) + (k-2)*(N/S/B) = N(S+K-2)/(SB) --> N/B,条件是S远大于K,即数据的份数大于节点数,这个很容易满足。所以通信时间不随节点数的增加而增加,只和数据总量以及带宽有关。其它通信操作比如reduce、gather以此类推。

那么在以GPU为通信节点的场景下,怎么构建通信环呢?如下图所示:

单机4卡通过同一个PCIe switch挂载在一棵CPU的场景:

单机8卡通过两个CPU下不同的PCIe switch挂载的场景:

NCCL实现

NCCL实现成CUDA C++ kernels,包含3种primitive operations: Copy,Reduce,ReduceAndCopy。目前NCCL 1.0版本只支持单机多卡,卡之间通过PCIe、NVlink、GPU Direct P2P来通信。NCCL 2.0会支持多机多卡,多机间通过Sockets (Ethernet)或者InfiniBand with GPU Direct RDMA通信。

下图所示,单机内多卡通过PCIe以及CPU socket通信,多机通过InfiniBand通信。

同样,在多机多卡内部,也要构成一个通信环

下面是单机 4卡(Maxwel GPU)上各个操作随着通信量增加的带宽速度变化,可以看到带宽上限能达到10GB/s,接近PCIe的带宽。

下图是Allreduce在单机不同架构下的速度比较:

先不看DGX-1架构,这是Nvidia推出的深度学习平台,带宽能达到60GB/s。前面三个是单机多卡典型的三种连接方式,第三种是四张卡都在一个PCIe switch上,所以带宽较高,能达到>10GB/s PCIe的带宽大小,第二种是两个GPU通过switch相连后再经过CPU连接,速度会稍微低一点,第一种是两个GPU通过CPU然后通过QPI和另一个CPU上的两块卡相连,因此速度最慢,但也能达到>5GB/s。

下图是Allreduce多机下的速度表现,左图两机8卡,机内PCIe,机间InfiniBand能达到>10GB/s的速度,InfiniBand基本上能达到机内的通信速度。

下图是NCCL在CNTK ResNet50上的scalability,32卡基本能达到线性加速比。

我们的实测实验

首先,在一台K40 GPU的机器上测试了GPU的连接拓扑(笔者注:可在命令行通过nvidia-smi topo --matrix查看),如下:

可以看到前四卡和后四卡分别通过不同的CPU组连接,GPU0和GPU1直接通过PCIe switch相连,然后经过CPU与GPU2和GPU3相连。

下面是测试PCIe的带宽,可以看到GPU0和GU1通信能达到10.59GB/s,GPU0同GPU2~3通信由于要经过CPU,速度稍慢,和GPU4~7的通信需要经过QPI,所以又慢了一点,但也能达到9.15GB/s。

而通过NVlink连接的GPU通信速度能达到35GB/s:

NCCL在不同的深度学习框架(CNTK/Tensorflow/Torch/Theano/Caffe)中,由于不同的模型大小,计算的batch size大小,会有不同的表现。比如上图中CNTK中Resnet50能达到32卡线性加速比,Facebook之前能一小时训练出ImageNet,而在NMT任务中,可能不会有这么大的加速比。因为影响并行计算效率的因素主要有并行任务数、每个任务的计算量以及通信时间。我们不仅要看绝对的通信量,也要看通信和计算能不能同时进行以及计算/通信比,如果通信占计算的比重越小,那么并行计算的任务会越高效。NMT模型一般较大,多大几十M上百M,不像现在image的模型能做到几M大小,通信所占比重会较高。

下面是NMT模型单机多卡加速的一个简单对比图:

以上就是对NCCL的一些理解,很多资料也是来自于NCCL的官方文档,欢迎交流讨论。

NVIDIA英伟达的Multi-GPU多卡通信框架NCCL相关推荐

  1. NVIDIA 英伟达发布H100 GPU,水冷服务器适配在路上

    导语 1.GPU的价值不止体现在深度学习,在高性能计算.人工智能.生物信息.分子模拟.计算化学.材料力学.系统仿真.流体力学.机械设计.生物制药.航空动力.地质勘探.气候模拟等领域,算法越来越复杂,需 ...

  2. Nvidia 英伟达的NSight GPU 调试如何下载

    NVIDIA Visual Profiler 正确学名,看清楚,并没有NSight,但是国内很多大牛都如是说 3G多,不下了,需要自取 https://developer.nvidia.com/zh- ...

  3. nvidia 英伟达 显卡 GPU 的计算能力

    nvidia 英伟达 显卡 GPU 的计算能力 https://developer.nvidia.com/zh-cn/cuda-gpus

  4. linux 七代 显卡,性能显著提升:NVIDIA 英伟达 发布 第七代 GPU架构 Volta

    性能显著提升:NVIDIA 英伟达 发布 第七代 GPU架构 Volta 2017-05-11 18:31:54 35点赞 42收藏 87评论 Microsoft(微软)Build2017开发者大会正 ...

  5. 2002年3月英伟达发布核弹GPU与大算力自动驾驶芯片

    2002年3月英伟达发布核弹GPU与大算力自动驾驶芯片 英伟达核弹级GPU:800亿晶体管,20块承载全球互联网流量 2022年3 月 22 日,在英伟达 GTC2022 上,英伟达介绍了 Hoppe ...

  6. AI开发者福音!阿里云推出国内首个基于英伟达NGC的GPU优化容器

    摘要: 3月28日,在2018云栖大会·深圳峰会上,阿里云宣布与英伟达GPU 云 合作 (NGC),开发者可以在云市场下载NVIDIA GPU 云镜像和运行NGC 容器,来使用阿里云上的NVIDIA ...

  7. NVIDIA英伟达:深度学习服务器搭建指南 | 交流会笔记

    主讲人:Ken(何琨)| NVIDIA开发者社区经理 张康 屈鑫 编辑整理 量子位 出品 | 公众号 QbitAI 7月21日,量子位联合NVIDIA英伟达举行了线下交流会,跟现场近百位开发者同学共同 ...

  8. 不是Nvidia(英伟达)显卡可以安装CUDA跑深度学习算法吗?

    不是Nvidia(英伟达)显卡可以安装CUDA跑深度学习算法吗? 答:不行! Cuda主要是面向Nvidia的GPU的.Intel和AMD的显示芯片都不能进行.所以,想要让cuda环境搭建在自己的Wi ...

  9. 被Linux之父骂醒?英伟达破天荒开源GPU内核驱动,网友:活久见

    终于等到了这一天:英伟达开源了他们的 Linux GPU 内核驱动. 「英伟达是我们遇到的硬件厂商中最麻烦的一个.」这是 Linux 内核总设计师 Linus Torvalds 十年前说过的一句原话. ...

最新文章

  1. Docker的使用(四:Docker Registry本地私有仓库搭建知识点总结)
  2. poj-1064Cable master(二分)
  3. 如何使用C来扩展python功能。
  4. IE、FF的基本注意事项
  5. GDCM:gdcm::PersonName的测试程序
  6. 用PHP做负载均衡指南
  7. 【Python爬虫】写个爬虫爬取自己的博客,可以刷访问量
  8. vscode中文支持xp_VSCode (Visual Studio Code) V1.43.0下载并设置成中文语言的方法
  9. Bailian2939 玩游戏【模拟】
  10. Luogu2680 [NOIP2015 提高组] 运输计划
  11. 软件如何实现屏幕共享?
  12. 小米miui查看连接过已保存的密码方法
  13. Linux下利用ssh远程文件传输 传输命令 scp
  14. FileNotFoundError: Could not find module ‘C:\Users\Yolanda\anaconda3\envs\python38\lib\site-packages
  15. 汽车行业V模型开发详解
  16. android如何从json字符串中取自己想要的数据
  17. 已解决 java.sql.SQLException: 列名无效
  18. elementUI中table单元格的合并,通用版
  19. 反射型XSS漏洞基础
  20. memset()函数的使用总结和细节

热门文章

  1. SpringBoot2 整合 AXIS2 服务端和客户端
  2. oracle 数据库_操作事项_05
  3. Flowable 数据库表结构 ACT_RU_IDENTITYLINK
  4. flowable6.4.2流程审批后涉及到的表
  5. Windiws环境安装轻量级文件服务器ftpserver
  6. Node.js 入门详解 (三)
  7. 符号库匹配不对的原因_中频点焊机焊接螺母有流渣是什么原因造成的?-苏州安嘉...
  8. C语言 函数不定长参数 - C语言零基础入门教程
  9. C语言 error C4996: This function or variable may be unsafe - C语言零基础入门教程
  10. React之setState使用