模型在多GPU运行时上遇到的坑

内容太冗杂,纠缠了我两三天的问题,具体问题和原因等有空再来整理吧。

cuda版本:10.0.130
1)list类型的网络层/参数不会被绑定到同一块GPU上,用 nn.ModuleList()或nn.ParameterList解决。
例如:使用nn.ModuleList(layers)时,在多GPU正常运行;使用self.attentions = [GraphAttentionLayer(n_feat, n_hid, dropout=dropout, alpha=alpha, concat=True) for _ in range(n_heads)] ; self.add_module('attention_{}'.format(i), attention)时在多GPU运行会报错:参数没在同一块GPU上。
list类型的多参数同样如此,用nn.ParameterList解决。
参考:
pytorch遇到的bug记录—2_羊藤枝的博客-CSDN博客
2019-06-17 pytorch nn.ParameterList - (jianshu.com)
原因:pytorch不会将list类型的参数绑定在一起,需要用nn.ModuleList()或 nn.ParameterList 进行绑定

2)多GPU上forward变量存储:
如果直接在模型forwrd里生成一个新的变量,那么他的存储位置是不确定的,可以用self.register_buffer()来解决。
3)pytorch1.6或1.4多次出现RuntimeError: cuda runtime error (700) :报错,却不知具体位置
根本原因:有变量或参数没有被加载到GPU上。
解决:将pytorch降级到1.0.0,然后会返回具体出错的位置。
4)Python 脚本运行时Segmentation fault (core dumped)
因为错误是内存越界访问,将stack size设置成没有限制
ulimit -a; ulimit -S -s unlimited
还要修改/etc/profile文件
参考:Python 脚本运行时Segmentation fault (core dumped)_chijiaodaxie的博客-CSDN博客

5)当使用多卡,多GPU并行运算时,学习了也应进行相应的放大N倍

你可能感兴趣的:(模型在多GPU运行时上遇到的坑)