环境

  • 4 GeForce GTX 1080 GPUS
  • docker image nnabla/nnabla-ext-cuda-multi-gpu:py36-cuda102-mpi3.1.6-v1.14.0

代码

  • 从仓库nnabla-ext-cuda-multi-gpu拉取镜像docker pull nnabla/nnabla-ext-cuda-multi-gpu:py36-cuda102-mpi3.1.6-v1.14.0
  • 运行docker run -it --rm --gpus all nnabla/nnabla-ext-cuda-multi-gpu:py36-cuda102-mpi3.1.6-v1.14.0
  • 添加test.py
import nnabla.communicators as C
from nnabla.ext_utils import get_extension_context
extension_module = "cudnn"
ctx = get_extension_context(extension_module)
comm = C.MultiProcessCommunicator(ctx)
comm.init()
print(f'sizes={comm.size}, divice_id={comm.rank}')
  • 运行mpiexec -np 4 python test.py将会抛出异常。(异常只发生在使用GPU数大于2时)

bug

抛出异常如下:

Traceback (most recent call last):
File "test.py", line 6, in <module>
comm.init()
File "communicator.pyx", line 121, in nnabla.communicator.Communicator.init
RuntimeError: target_specific error in init
/home/gitlab-runner/builds/g9zRZKFe/2/nnabla/builders/all/nnabla-ext-cuda/src/nbla/cuda/communicator/multi_process_data_parallel_communicator.cu:358
ncclCommInitRank failed.

使用NCCL_DEBUG=INFO查看详细信息mpiexec -np 4 -x NCCL_DEBUG=INFO python test.py

...
0db89117f3b2:87:87 [2] include/shm.h:28 NCCL WARN Call to posix_fallocate failed : No space left on device
0db89117f3b2:87:87 [2] NCCL INFO include/shm.h:41 -> 2 0db89117f3b2:87:87 [2] include/shm.h:48 NCCL WARN Error while creating shared memory segment nccl-shm-recv-6d2dacd576938b74-0-3-2 (size 9637888)
...

可以看到没有多余的共享内存,但是使用nvidia-smi查看GPU情况,发现内存并没有过多使用。

+-----------------------------------------------------------------------------+
| NVIDIA-SMI 450.36.06 Driver Version: 450.36.06 CUDA Version: 11.0 |
|-------------------------------+----------------------+----------------------+
| GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC |
| Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. |
| | | MIG M. |
|===============================+======================+======================|
| 0 GeForce GTX 1080 On | 00000000:01:00.0 Off | N/A |
| 27% 30C P8 5W / 180W | 815MiB / 8119MiB | 0% Default |
| | | N/A |
+-------------------------------+----------------------+----------------------+
| 1 GeForce GTX 1080 On | 00000000:02:00.0 Off | N/A |
| 27% 33C P8 6W / 180W | 4MiB / 8119MiB | 0% Default |
| | | N/A |
+-------------------------------+----------------------+----------------------+
| 2 GeForce GTX 1080 On | 00000000:03:00.0 Off | N/A |
| 28% 35C P8 5W / 180W | 4MiB / 8119MiB | 0% Default |
| | | N/A |
+-------------------------------+----------------------+----------------------+
| 3 GeForce GTX 1080 On | 00000000:04:00.0 On | N/A |
| 28% 34C P8 6W / 180W | 4MiB / 8118MiB | 0% Default |
| | | N/A |
+-------------------------------+----------------------+----------------------+ +-----------------------------------------------------------------------------+
| Processes: |
| GPU GI CI PID Type Process name GPU Memory |
| ID ID Usage |
|=============================================================================|
+-----------------------------------------------------------------------------+

原因

异常原因是NCCL不能在/dev/shm创建共享内存文件。因为docker默认的/dev/shm文件的大小为64MB太小了,所以当使用GPU数大于2时,会显示内存不够。

之前版本不出现这个错误,原因是nccl从2.6升级到2.7后,GPU之间的通信方式从p2p改为使用共享内存片段,所以如果使用nccl2.7以下版本将不会出现这个问题。

解决

有3中方式:

  • /etc/nccl.conf~/.nncd.conf文件中,添加配置NCCL_SHM_DISABLE=1。不适用共享内存,但是使用运行效率会降低。
  • 可以映射宿主机上的/dev/shm,即docker run -v /dev/shm:/dev/shm ...,但是这样会在宿主机上留下脏文件。
  • 运行时,修改容器共享内存的大小,即docker run --shm-size=256m ...

参考

最新文章

  1. git上传文件出错的时候
  2. keepalived mariadb 主主
  3. Spring+Mybatis多数据源配置
  4. 表单验证 jQuery Validate
  5. C#连接、访问MySQL数据库
  6. V9 二次开发技术篇之 模型数据库
  7. 杭州电acm理工大舞台版
  8. MySQL data路径为空解决方法
  9. SqlServer查询优化方法
  10. elasticsearch系列八:ES 集群管理(集群规划、集群搭建、集群管理)
  11. 非旋 treap 结构体数组版(无指针)详解,有图有真相
  12. ionic iphone下的问题
  13. cadence 17.2 安装破解
  14. python中for循环的三种遍历方式
  15. 超详细的Web前端开发规范文档
  16. linux 断网 扫描基本命令
  17. [Go] 单元测试/性能测试 (go test)
  18. AsyncHttpClient的连接池使用逻辑
  19. 试着用React写项目-利用styled-components解决样式问题
  20. Android短信发送器(2)

热门文章

  1. 为k8s预留系统资源
  2. C语言初级编程实践:2048小游戏
  3. Windows10下的MediaWiki的部署启动
  4. 这次我让你彻底弄懂 RESTful
  5. vs2019 Com组件初探-通过IDispatch接口调用Com
  6. 第7.13节 案例详解:Python类变量
  7. 第十六章、Model/View开发:QColumnView的作用及对应Model
  8. PyQt(Python+Qt)学习随笔:QAbstractItemView的showDropIndicator属性
  9. Kubernetes-21:Apiserver等证书修改使用年限
  10. 转:minhash