Da das Modelltraining auf verschiedenen GPUs auf dem Server durchgeführt werden muss, gibt es hier einige Möglichkeiten, die Verwendung von GPUs zu ändern.
1. Änderung der einzelnen GUP-Nutzung
Hinweis: „cuda:0“ oder „cuda“ bedeuten beide, dass die Startgeräte-ID 0 ist und das System standardmäßig bei 0 startet. Die Startposition kann nach Bedarf geändert werden. Beispielsweise entspricht „cuda:1“ „cuda:0“ oder „cuda“.
# 任取一个,torch版本不同会有差别
torch.cuda.device(id) # id 是GPU编号
or
torch.cuda.set_device(id)
or
torch.device('cuda')
Eine andere Möglichkeit besteht darin, die laufende GPU im Terminal anzugeben:
CUDA_VISIBLE_DEVICES=1 python main.py
, was darauf hinweist, dass nur die erste GPU sichtbar ist und andere GPUs nicht verfügbar sind. Die GPU-Nummer von Block 1 hat sich in Block 0 geändert. Wenn sie weiterhin verwendet wird, cuda:1
wird eine ungültige Geräteordnungszahl gemeldet. Das Folgende ist dasselbe.
Speichern Sie das Trainingsmodell in einer einzelnen GPU (wählen Sie 1 von 2).
state = {'model': self.model.state_dict(), 'epoch': ite}
torch.save(state, self.model.name())
or # 直接保存
torch.save(self.model.state_dict(), 'Mymodel.pth') # 当前目录
Laden Sie ein Einzel-GPU-Trainingsmodell in eine einzelne GPU/CPU (wählen Sie 1 aus 3).
checkpoint = torch.load(self.model.name())
self.model.load_state_dict(checkpoint['model'])
or # 直接加载
self.model.load_state_dict(torch.load('Mymodel.pth'))
or # load gpu or cpu
if torch.cuda.is_available(): # gpu
self.model.load_state_dict(torch.load('Mymodel.pth'))
else: # cpu 官方推荐CPU的加载方式
checkpoint = torch.load(self.model.name(),map_location=lambda storage, loc: storage)
self.model.load_state_dict(checkpoint['model'])
2. Mehrere GPU-Nutzungsänderungen
1. In der Terminal-Shell:CUDA_VISIBLE_DEVICES=0,1,3 python main.py
2.
# gpu_ids = [0, 1, 3] # 或 os.environ["CUDA_VISIBLE_DEVICES"] = "0,1,3"
# os.environ["CUDA_VISIBLE_DEVICES"] = ','.join(map(str, [0, 1, 3]))
import os
os.environ["CUDA_VISIBLE_DEVICES"] = "0,1,3" # CUDA_VISIBLE_DEVICES 表当前可被python程序检测到的显卡
device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu") # 多GPU时可指定起始位置/编号
# 若不加if项,也不报错,但训练可能会变成单GPU
if torch.cuda.device_count() > 1: # 查看当前电脑可用的gpu数量,或 if len(gpu_ids) > 1:
print("Let's use", torch.cuda.device_count(), "GPUs!")
# self.model = torch.nn.DataParallel(self.model, device_ids=gpu_ids)
self.model = torch.nn.DataParallel(self.model) # 声明所有设备
net = self.model.to(device) # 从指定起始位置开始,将模型放到gpu或cpu上
images = self.images.to(device) # 模型和训练数据都放在主设备
labels = self.labels.to(device)
Hinweis: Um das Multi-GPU-Training zu verwenden, verwenden Sie model = Torch.nn.DataParallel(model). Standardmäßig werden alle vorhandenen Grafikkarten verwendet.
Trainingsmodelle auf mehreren GPUs speichern (wählen Sie 1 von 3)
if isinstance(self.model,torch.nn.DataParallel): # 判断是否并行
self.model = self.model.module
state = {'model': self.model.state_dict(), 'epoch': ite}
torch.save(state, self.model.name()) # No-module
or
if isinstance(self.model, torch.nn.DataParallel):
torch.save(self.model.module.stat_dict, 'Mymodel') # No-module
else:
torch.save(self.model.stat_dict, 'Mymodel') # No-module
or # 直接保存
torch.save(self.model.state_dict(), 'Mymodel.pth') # is-module