之前声明cuda设备的方式都是首先os.environ['CUDA_VISIBLE_DEVICES'] = '0,1,2,3,4,5,6,7'
, 代表能看到所有设备,然后再通过device = 'cuda:6'
+model = model.to(device)
, 放到其中某个设备上。今天要跑一个新模型,仍然选择这种方式,但是非常神奇,我生命了'cuda:6'
,但是模型偏偏就是会跑到'cuda:0'
和'cuda:6'
上
于是换了种方式,os.environ['CUDA_VISIBLE_DEVICES'] = '5'
,只声明看到要跑的那个设备,然后device = 'cuda:0'
+model = model.to(device)
将设备放在这唯一的设备上,于是只能在这个设备上跑了
但又出现了新的问题,就是之后在模型的forward过程时,会报错,说模型和变量不在同一个设备上,这一点我之前经常会遇到,因此我自己写的代码里,除了会声明模型的设备外,还会通过tensor = tensor.cuda(DEVICE = 'cuda:0')
把模型也放在这个设备上。但是这是我直接down的论文的代码呀,肯定不会让我在调bug的时候额外加这么多代码
当时为了换成自己的方式,把作者的model = nn.DataParallel(model).cuda()
语句换成了自己的model = model.to(device)
,于是我又改了回去,现在的声明设备的语句是先os.environ['CUDA_VISIBLE_DEVICES'] = '5'
,然后model = nn.DataParallel(model).cuda()
,再运行,发现不再报错了,难道是这个语句在声明model设备的同时还能声明张量设备?