如题,首先报了如下错误:
AssertionError: Gather function not implemented for CPU tensors
我心想,这不是dp的时候的问题出错了吗,正好趁这个时机研究下pytorch做并行的内核方式。
于是首先查看了
anaconda3/envs/torch1.7/lib/python3.8/site-packages/torch/nn/parallel/scatter_gather.py
又查看了
anaconda3/envs/torch1.7/lib/python3.8/site-packages/torch/nn/parallel/_functions.py
还查看了
/cfs/doxu/software/anaconda3/envs/torch1.7/lib/python3.8/site-packages/torch/nn/parallel/data_parallel.py
最后发现了一篇有用的帖子,终于弄懂了pytorch的dp实现,以后可以写个小demo。
[PyTorch 源码解读之 DP & DDP:模型并行和分布式训练解析]https://zhuanlan.zhihu.com/p/343951042
弄懂完原理之后,就开始定位bug所在。传入gather的数据不对,那么传入这里我gather的tensor是什么?很显然是loss,恰巧loss是我自己改的,所以很有可能bug出在这里,于是我打印loss的device,发现是tuple,喔,原来是最后的[0]忘了加,导致我的loss是由tensor组成的tuple,而python对于tuple的处理机制是存储在内存中,内存这一块显然属于cpu不属于gpu,所以报错我有的tensor在cpu上,添加[0],解决问题。
loss = self.loss(output, tgt)[0]
PS,以后还是不要用tuple了,用dict好一点,毕竟内存消耗list>tuple>dict
【list最大是因为list是动态的,它需要存储指针来指向对应的元素。另外,因为列表是可变的,为了保存插入
的高效,一般会预留额外的存储空间,因此就需要记录实时的空间使用情况,当空间不足时,额外再分配空间】
网友评论