目录
训练时优化:DataParallel
拥有多卡环境,利用DataParallel优化。
优点:将相同的模型复制到所有GPU,其中每个GPU消耗输入数据的不同分区,可以极大地加快训练过程。
缺点:不适用于某些模型太大而无法容纳单个GPU的用例。
定义:CLASS torch.nn.DataParallel(module, device_ids=None, output_device=None, dim=0)
module:输入的模块,可以绑定网络模型,也可以绑定优化器。
output_device:设备id
output_device:输出所在设备id(默认为device 0)
device_ids = [0, 1]
net = torch.nn.DataParallel(net, device_ids=device_ids)
此时device id 0默认为你的gpu 0.
可通过设置:
os.environ["CUDA_DEVICE_ORDER"] = "PCI_BUS_ID"
os.environ["CUDA_VISIBLE_DEVICES"] = "2, 3"
这样device id 0就默认为gpu 2了,可以避免第一张卡占用过高等问题。
优化器转换成DataParallel
optimizer = torch.optim.SGD(net.parameters(), lr=lr)
optimizer = torch.nn.DataParallel(optimizer, device_ids=device_ids)
注意事项 :
因为使用了 nn.DataParallel,所以网络模型net和优化器optimizer 都变成了一个nn.module。当你需要保存的时候,要调用一次.module方法:
保存模型变更:
torch.save(net.state_dict(), path)
torch.save(net.module.state_dict(), path)
加载模型变更为:
net=nn.DataParallel(Resnet18())
net.load_state_dict(torch.load(path))
net=net.module
优化器使用:
optimizer.step() # 原版
optimizer.module.step() #DataParallel
多进程 multiprocessing 或flask
1. multiprocessing
import multiprocessing
multiprocessing.set_start_method('spawn')
记得使用spawn防止卡死。
参考python3多进程方式,可以用多个进程实现模型并行加载。例如我要对一系列图片作出处理时,可以用这个方法加速。
python的多线程和多进程使用方法类似,都是先定义任务,在将任务排到线程或者进程中,等待结果。
import multiprocessing as mp
import threading as td
def job(a,d):
print('任务')
t1 = td.Thread(target=job,args=(1,2))
p1 = mp.Process(target=job,args=(1,2))
t1.start()