一、转换数据为浮点数
# (张量不执行inplace操作,因此要重新赋值)
tensorX = torch.ones((3,3))
tensorX.to(torch.float64)
二、将张量放至gpu
# (张量不执行inplace操作,因此要重新赋值)
tensorX = tensorX.to('cuda')
# 指定gpu
tensorX = tensorX.to('cuda:0')
@以下是另一种方法
device = torch.device('cuda:0')
tensorX = tensorX.to(device)
三、将模型放至gpu
# (模型执行inplace操作,因此不需要重新赋值)
net.to('cuda')
# 指定gpu
net.to('cuda:0')
@以下是另一种方法
device = torch.device('cuda:0')
net.to(device)
四、注意点
1.1 gpu数量尽量为偶数,避免异常中断
1.2 数据量比较小时,多gpu没有单gpu好,而单gpu没有cpu好
1.3 若内存不够大,使用多gpu训练时可设置pin_memory=False
1.4 在只有cpu的电脑中加载gpu下的模型时要设置map_location='cpu'
net = torch.load(f,map_location='cpu')
state_dict_load = torch.load(f,map_location='cpu')
1.5 多gpu训练的模型需要特别的加载形式
'''
'module.linears.0.weight','module.linears.1.weight',
'module.linears.2.weight','module.linears.3.weight'
'''
from collections import OrderedDict
# 构建有序字典
new_state_dict = OrderedDict()
for k,v in state_dict_load.items():
# 如果k以'module.'开头则取第七个开始的
namekey = k[7:] if k.startswith('module.') else k
new_state_dict[namekey] = v
五、前期准备
# 判断gpu是否可用
torch.cuda.is_available()
# 获取可使用的gpu数量
torch.cuda.device_count()
# 查看gpu具体配置
nvidia-sim
# 获取gpu名称
torch.cuda.get_device_name()
# 为当前gpu设置随机种子
torch.cuda.manual_seed()
# 为所有可见可用的gpu设置随机种子
torch.cuda.manual_seed_all()
# gpu的选择
'''按顺序选2号gpu和3号gpu'''
os.environ.setdefault('CUDA_VISIBLE_DEVICES','2,3')
'''按顺序选0号、3号和2号gpu'''
os.environ.setdefault('CUDA_VISIBLE_DEVICES','0,3,2')
六、多gpu运算的分发并行机制(单主机多gpu)
# 先分发(分配任务),再并行(并行运行)
@每个gpu中的数据量为batchsize除参与分发的gpu数量
# model:需要包装分发的模型
# device_ids:可分发的gpu,默认分发到所有可见可用的gpu
# output_device:结果输出设备
torch.nn.DataParallel(model,device_ids=None,output_device=None,dim=0)
model.to(device)