| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 人工智能 -> pytorch分布式训练小结 -> 正文阅读 |
|
[人工智能]pytorch分布式训练小结 |
经过了几天的学习和总结,得到了一小点知识。破除理解上的障碍,希望和大家共同分享。 当前的pytorch分布式训练,主要使用两种方法:DataParallel和DistributedDataParallel。本篇文章对这两种方法的使用流程和关键步骤进行介绍,不涉及很复杂的原理和内核,仅仅方便大家理解和使用。 DistributedDataParallel
1)设置可使用的GPU:
2)引入local_rank参数。?local_rank是赋值给一个分布式进程组组内的每个进程的唯一识别。该参数有两种引入方式:
3)初始化通信
4)构建数据集采样对象
5)? 根据local_rank,配置当前进程使用的本地模型及GPU,保证每一个进程使用的GPU是一定的。我们列举出多种方式:
6)保证进程按次序执行(可选)
7)将模型移至到DistributedDataParallel中,进行分布式配置
8)释放内存,消除缓存:
注意,命令启动行( ?2)——②除外 ?)或者也可以使用torch.multiprocessing.spawn():
应用解释: python -m torch.distributed.launch main.py相当于使用torch.distributed.launch.py来运行我们的main.py,其中torch.distributed.launch会向我们的运行程序传递一些变量,包括nproc_per_node参数。该参数将会引导当前主机创建nproc_per_node个进程,每个进程会独立执行训练脚本。同时,每个进程会被分配一个local_rank参数来表示进程在当前主机(参数rank,如果是一个主机,就默认为0)上的编号,用以合理分配和调度本地的GPU资源(这也是为什么需要torch.cuda.set_device(args.local_rank)设定默认的GPU,因为每个进程需要在一个独立的GPU上)。在实际应用中,DDP会自动帮助我们将模型从local_rank=0扩展到其他进程状态。 官网文献: https://pytorch.org/docs/master/notes/ddp.html? https://pytorch.org/tutorials/intermediate/ddp_tutorial.html? DataParallel:1)设置可用的GPU
2)构建GPU设备对象,方式包括
3)获取数据
4)构建模型
5)分布式布置模型
6)将模型和数据置于GPU上??# 该步到底该置于5)之前还是之后,其实都可以,因为DataParallel不是模型并行。但最好置于之后,随官网。
7)将优化器和学习率规划器进行分布式搭载(可选):
8)损失聚合(可选)。由于DataParallel执行的是数据并行,而非模型并行,因此有人讨论过并行数据处理之后的聚合。但实际上,效果并没有多么突出。聚合方式主要是两种:
官网文献: https://pytorch.org/tutorials/beginner/blitz/data_parallel_tutorial.html? 关于 DataParallel和DistributedDataParallel: 1) 在 DataParallel 中,batch size 设置必须为单卡的 n 倍,但是在 DistributedDataParallel 内,batch size 设置于单卡一样即可。 2)??和dataparallel不同,dataparallel需要将batchsize设置成n倍的单卡batchsize,而distributedsampler使用的情况下,batchsize设置与单卡设置相同。 3) 在DDP中,?有几个新的参数:world size, local rank, rank。world size指进程总数,在这里就是我们使用的GPU数量;rank指进程序号,local_rank指本地序号,两者的区别在于前者用于进程间通讯,后者用于本地GPU的分配。 关于pytorch中的torch.device("cuda")和torch.device("cuda:X")解释: 1)当使用os.environ['CUDA_VISIBLE_DEVICES'] = '1,0'或者device_ids=[1,0]选择可用的GPU,这里的编号数字是指GPU的物理编号。而编号的位置(如1的位置是0),是我们使用时的逻辑编号。 2)标题的X表示,需要将缓冲区和并行模块(缓冲区和并行模块的作用,在于进行初始的模型存储、数据分发等操作)的参数设置在逻辑编号X上。该逻辑编号X也应该是device_ids列表的首元素,即device_ids = [X,...]。原因是,官网要求相关设置应该在device_ids[0]上。 3)如上例:如果这里的X=0,则实际上在使用物理编号为1的GPU;如果这里的X=1,则实际上在使用物理编号为0的GPU。如果没有明确参数X,则默认使用逻辑编号为0。 ?? 博客参考文献:(欲知更多细节,请阅读参考文献) https://oldpan.me/archives/pytorch-to-use-multiple-gpus https://yangkky.github.io/2019/07/08/distributed-pytorch-tutorial.html https://zhuanlan.zhihu.com/p/76638962 分布式系统中常用的一些概念、通信、初始化等等介绍,非常详细 https://blog.csdn.net/m0_38008956/article/details/86559432 https://zhuanlan.zhihu.com/p/98535650 DP、DDP、apex、Horovod的使用介绍以及样例 https://blog.csdn.net/daydayjump/article/details/81158777 简单介绍DP https://blog.csdn.net/love1005lin/article/details/116404049 https://github.com/tczhangzhi/pytorch-distributed/blob/master/distributed.py https://blog.csdn.net/weixin_41297324/article/details/113361394?关于DataParallel多块GPU调用细节问题 https://zhuanlan.zhihu.com/p/86441879? 比较全面的分布式讲解,包含了DP、DDP以及少量样例 https://www.cnblogs.com/c-chenbin/p/14809822.html?DataParallel样例展示 https://zhuanlan.zhihu.com/p/74792767?DP和DDP的样例展示 https://zhuanlan.zhihu.com/p/158375254?形式化表示分布式训练 https://jishuin.proginn.com/p/763bfbd2f4d2 非常好的一篇文章,给出了常见的代码实现样例 https://github.com/kamalkraj/BERT-NER/blob/dev/run_ner.py?该代码在实现BERT的finetuning过程中给出了比较好的分布式训练实现 项目代码示例: https://github.com/erikwijmans/skynet-ddp-slurm-example/blob/master/ddp_example/train_cifar10.py https://github.com/XiaoyuWant/DDP_Classification_pytorch/blob/main/main.py https://github.com/bl0/moco/blob/master/train.py https://github.com/lesliejackson/PyTorch-Distributed-Training/blob/master/main.py https://github.com/dougsouza/pytorch-sync-batchnorm-example https://github.com/ankur6ue/node2vec_dataparallel/blob/master/node2vec_dp.py |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/27 18:26:48- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |