您当前的位置:首页 > IT编程 > python
| C语言 | Java | VB | VC | python | Android | TensorFlow | C++ | oracle | 学术与代码 | cnn卷积神经网络 | gnn | 图像修复 | Keras | 数据集 | Neo4j | 自然语言处理 | 深度学习 | 医学CAD | 医学影像 | 超参数 | pointnet | pytorch | 异常检测 | Transformers | 情感分类 | 知识图谱 |

自学教程:Pytorch distributed 多卡并行载入模型操作

51自学网 2021-10-30 22:31:09
  python
这篇教程Pytorch distributed 多卡并行载入模型操作写得很实用,希望能帮到您。

一、Pytorch distributed 多卡并行载入模型

这次来介绍下如何载入模型。

目前没有找到官方的distribute 载入模型的方式,所以采用如下方式。

大部分情况下,我们在测试时不需要多卡并行计算。

所以,我在测试时只使用单卡。

from collections import OrderedDictdevice = torch.device("cuda")model = DGCNN(args).to(device)  #自己的模型state_dict = torch.load(args.model_path)    #存放模型的位置new_state_dict = OrderedDict()for k, v in state_dict.items():    name = k[7:] # remove `module.`    new_state_dict[name] = v    # load paramsmodel.load_state_dict (new_state_dict)

二、pytorch DistributedParallel进行单机多卡训练

One_导入库:

import torch.distributed as distfrom torch.utils.data.distributed import DistributedSampler

Two_进程初始化:

parser = argparse.ArgumentParser()parser.add_argument('--local_rank', type=int, default=-1)# 添加必要参数# local_rank:系统自动赋予的进程编号,可以利用该编号控制打印输出以及设置devicetorch.distributed.init_process_group(backend="nccl", init_method='file://shared/sharedfile',rank=local_rank, world_size=world_size)# world_size:所创建的进程数,也就是所使用的GPU数量# (初始化设置详见参考文档)

Three_数据分发:

dataset = datasets.ImageFolder(dataPath)data_sampler = DistributedSampler(dataset, rank=local_rank, num_replicas=world_size)# 使用DistributedSampler来为各个进程分发数据,其中num_replicas与world_size保持一致,用于将数据集等分成不重叠的数个子集dataloader = DataLoader(dataset, batch_size=batch_size, num_workers=1,drop_last=True, pin_memory=True, sampler=data_sampler)# 在Dataloader中指定sampler时,其中的shuffle必须为False,而DistributedSampler中的shuffle项默认为True,因此训练过程默认执行shuffle

Four_网络模型:

torch.cuda.set_device(local_rank)device = torch.device('cuda:'+f'{local_rank}')# 设置每个进程对应的GPU设备D = Model()D = torch.nn.SyncBatchNorm.convert_sync_batchnorm(D).to(device)# 由于在训练过程中各卡的前向后向传播均独立进行,因此无法进行统一的批归一化,如果想要将各卡的输出统一进行批归一化,需要将模型中的BN转换成SyncBN   D = torch.nn.parallel.DistributedDataParallel(D, find_unused_parameters=True, device_ids=[local_rank], output_device=local_rank)# 如果有forward的返回值如果不在计算loss的计算图里,那么需要find_unused_parameters=True,即返回值不进入backward去算grad,也不需要在不同进程之间进行通信。

Five_迭代:

data_sampler.set_epoch(epoch)# 每个epoch需要为sampler设置当前epoch

Six_加载:

dist.barrier()D.load_state_dict(torch.load('D.pth'), map_location=torch.device('cpu'))dist.barrier()# 加载模型前后用dist.barrier()来同步不同进程间的快慢

Seven_启动:

CUDA_VISIBLE_DEVICES=1,3 python -m torch.distributed.launch --nproc_per_node=2 train.py --epochs 15000 --batchsize 10 --world_size 2# 用-m torch.distributed.launch启动,nproc_per_node为所使用的卡数,batchsize设置为每张卡各自的批大小

以上为个人经验,希望能给大家一个参考,也希望大家多多支持51zixue.net。


Pytorch中的学习率衰减及其用法详解
解决pytorch 损失函数中输入输出不匹配的问题
万事OK自学网:51自学网_软件自学网_CAD自学网自学excel、自学PS、自学CAD、自学C语言、自学css3实例,是一个通过网络自主学习工作技能的自学平台,网友喜欢的软件自学网站。