Der Server nutzt PyTorch auf verschiedene Arten für die Verwendung mit mehreren GPUs oder einer einzelnen GPU

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:1wird 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

Guess you like

Origin blog.csdn.net/zhaodongdz/article/details/128396020