Pytorch distributed 多卡并行载入模型操作

作者:orientliu96 时间:2023-03-01 10:17:09 

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

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

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

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

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


from collections import OrderedDict
device = 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 params
model.load_state_dict (new_state_dict)

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

One_导入库:


import torch.distributed as dist
from torch.utils.data.distributed import DistributedSampler

Two_进程初始化:


parser = argparse.ArgumentParser()
parser.add_argument('--local_rank', type=int, default=-1)
# 添加必要参数
# local_rank:系统自动赋予的进程编号,可以利用该编号控制打印输出以及设置device

torch.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设置为每张卡各自的批大小

来源:https://blog.csdn.net/Orientliu96/article/details/104702520

标签:Pytorch,distributed,多卡,并行
0
投稿

猜你喜欢

  • 详解python--模拟轮盘抽奖游戏

    2023-07-25 15:35:14
  • MySQL忘记root密码错误号码1045的解决办法

    2024-01-20 17:00:43
  • Pytorch结合PyG实现MLP过程详解

    2022-05-01 21:51:55
  • python多线程之事件Event的使用详解

    2022-12-21 11:46:10
  • php7性能提升的原因详解

    2024-05-03 15:34:19
  • python3+PyQt5实现支持多线程的页面索引器应用程序

    2022-02-17 02:02:11
  • python基于三阶贝塞尔曲线的数据平滑算法

    2022-04-19 18:23:06
  • vue+elementUI实现动态面包屑

    2024-05-02 17:11:02
  • Python3 实现随机生成一组不重复数并按行写入文件

    2021-11-25 18:05:35
  • Keras多线程机制与flask多线程冲突的解决方案

    2023-09-12 02:10:51
  • PyQtGraph在pyqt中的应用及安装过程

    2022-02-27 17:00:14
  • pytorch构建多模型实例

    2021-05-14 13:30:00
  • Oracle数据库部分迁至闪存存储的实现方法

    2024-01-26 11:22:31
  • 详解python分布式进程

    2023-07-01 16:25:16
  • Python爬虫之Selenium实现键盘事件

    2022-08-28 03:40:37
  • 《写给大家看的设计书》阅读笔记之对比原则

    2009-07-15 10:14:00
  • 关于Pycharm安装第三方库超时 Read time-out的问题

    2022-03-08 10:12:43
  • 实例讲解Oracle到SQL Server主键迁移

    2009-03-25 13:30:00
  • Python OrderedDict字典排序方法详解

    2022-01-07 13:32:09
  • Hadoop中的Python框架的使用指南

    2023-09-06 14:23:40
  • asp之家 网络编程 m.aspxhome.com