一、显示GPU信息

查看当前哪些GPU设备正在被使用,以及它们的使用情况,使用nvidia-smi命令。这是NVIDIA提供的一个用于监视和管理NVIDIA GPU的命令行工具。

nvidia-smi

显示如下信息:

单gpu跑多个训练_人工智能

表格中各个参数的含义如下:

  1. Driver Version: 显卡驱动的版本号。
  2. CUDA Version: CUDA工具包的版本号,它是用于GPU计算的并行计算平台和应用程序编程接口。
  3. GPU Name: GPU设备的名称。
  4. Persistence-M: 表示GPU设备是否启用了Persistence Mode。Persistence Mode可确保GPU在空闲时不会被释放,以便更快地响应计算请求。
  5. Bus-Id: GPU设备在系统总线上的ID。
  6. Disp.A: 如果GPU设备支持显示输出,则会显示 "On",否则为 "Off"。
  7. Volatile Uncorr. ECC: 显存中不可纠正错误的数量。在这里是 "N/A",表示没有报告不可纠正的错误。
  8. Fan, Temp, Perf, Pwr:Usage/Cap:
  • Fan: GPU风扇的转速。
  • Temp: GPU温度。
  • Perf: GPU的性能状态。
  • Pwr:Usage/Cap: 当前电源使用量与电源容量的比率。
  1. Memory-Usage:
  • Used: 当前已使用的显存量。(/1024=GB)
  • Free: 当前空闲的显存量。
  1. GPU-Util: GPU计算资源的使用率。
  2. Compute M.: 如果GPU设备支持计算模式,会显示 "Default" 或其他相应模式。
  3. MIG M.: 如果GPU设备支持GPU实例划分(MIG,Multi-Instance GPU),会显示相应的MIG模式。

二、多GPU并行训练

1. API

import torch
torch.nn.DataParallel(module, device_ids=None, output_device=None, dim=0)

参数:

  •     module:即模型,此处注意,虽然输入数据被均分到不同gpu上,但每个gpu上都要拷贝一份模型。
  •     device_ids:即参与训练的gpu列表,例如三块卡, device_ids = [0,1,2]。
  •     output_device:指定输出gpu,一般省略。在省略的情况下,默认为第一块卡,即索引为0的卡。此处有一个问题,输入计算是被几块卡均分的,但输出loss的计算是由这一张卡独自承担的,这就造成这张卡所承受的计算量要大于其他参与训练的卡。
  •     dim:其表示tensors被分散的维度,默认是0,nn.DataParallel将在dim0(批处理维度)中对数据进行分块,并将每个分块发送到相应的设备。

如果你有多张GPU卡,并且想要在这多张卡上并行处理数据,可以使用torch.nn.DataParallel。在加载保存好的模型参数时,确保将模型加载到主设备(主GPU卡),然后再将其包装在DataParallel中。

示例:

import torch
from your_model_module import YourModel  # 请替换为你的模型所在的模块

# 假设你的模型类是YourModel
model = YourModel()

# 加载保存好的模型参数
checkpoint = torch.load('your_checkpoint.pth')  # 请替换为你的checkpoint文件路径
model.load_state_dict(checkpoint['model_state_dict'])

# 确保模型加载到主设备(主GPU卡)
device = torch.device("cuda:0")
model = model.to(device)

# 包装模型在DataParallel中
model = torch.nn.DataParallel(model)

# 现在,你可以使用model进行并行计算

请确保模型类定义与your_model_module一致。此外,如果在训练模型时使用了其他信息(例如优化器的状态、训练迭代次数等),可能还需要从checkpoint中加载这些信息。根据训练设置,可能需要调整加载的内容。

# 加载其他训练信息
optimizer.load_state_dict(checkpoint['optimizer_state_dict'])
epoch = checkpoint['epoch']

总的来说,先加载模型参数,然后将模型加载到GPU主设备上,最后将模型包装在DataParallel中。

三、指定GPU训练

可以使用os.environ["CUDA_VISIBLE_DEVICES"]来设置使用的GPU设备。在训练模型之前,可以将这个环境变量设置为想要使用的GPU设备的索引,从而限制模型只在指定的GPU上训练。

import os

os.environ["CUDA_VISIBLE_DEVICES"] = "0"

也可以指定多个GPU

import os
os.environ['CUDA_VISIBLE_DEVICES'] = '0,1,2,3,4,5' #指定GPU编号
device = torch.device("cuda") #创建GPU对象

#数据放在GPU
x_train = Variable(train,requires_grad=True).to(device=device,dtype=torch.float32) #把训练变量放到GPU

#模型放在GPU
net = DNN(layers)
net = nn.DataParallel(net)
net.to(device=device)