Pytorch 多GPU训练-多计算节点并行-All you need
时间:2019-09-30
本文章向大家介绍Pytorch 多GPU训练-多计算节点并行-All you need,主要包括Pytorch 多GPU训练-多计算节点并行-All you need使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
概述
本篇介绍多计算节点上的pytorch分布式训练。从环境配置到运行demo的所有步骤,step by step。没有理论原理,理论原理可以参考这里.
基础环境
多台linux计算节点,通过网络连接,不同主机之间可以相互ping通。网速越快越好,如果通信速度比较慢,就不用怎么考虑分布式训练。
所有linux计算节点都包含若干GPU,GPU数量可以不一致,但是所有GPU计算速度尽量一致,否则模型的同步时会等待大量时间(短板效应)。
所有计算节点都拥有Pytorch运行环境,即都可以单独的运行训练代码。
NFS环境搭建
这里NFS有两个作用:(1)集群初始化时作为多个进程(不同主机上)UDS(unix domain socket)的通信地址;(2)数据集统一存放在NFS目录上,所有进程都可以同时访问。
选择一台与计算节点同一网段的linux主机作为存储节点,或者使用计算节点中的一台作为存储节点。
存储节点操作如下:
apt-get install nfs-kernel-server
<path to share> *(rw,sync,no_root_squash,no_subtree_check) # insert this line to /etc/exports, save & exit
exportfs -a
数据集保存到共享目录中。
所有计算节点将共享目录挂载到本地:
mkdir /mnt/nfs
mount -t nfs <ip of storage node>:<path to share> /mnt/nfs
分布式训练
代码见: github ,需要自己更改数据集的地址。
运行demo
分别在三个主机上运行如下的命令。word_size 为 3,当启动的进程数少于3时,所有已经启动的进程会等待,进程数达到3时集群创建成功,训练开始。每个计算节点都使用该计算节点上的两个GPU --gpu_devices 0 1
。
# node 1
python multigpu_demo_v3.py \
--init_method file://<absolute path to nfs file> \
--rank 0 \
--world_size 3 \
--gpu_devices 0 1
# node 2
python multigpu_demo_v3.py \
--init_method file://<absolute path to nfs file> \
--rank 1 \
--world_size 3 \
--gpu_devices 0 1
# node 3
python multigpu_demo_v3.py \
--init_method file://<absolute path to nfs file> \
--rank 2 \
--world_size 3\
--gpu_devices 0 1
更多测试细节见github。
总结
Pytorch里的分布式训练只能实现增大batch size的作用,对于速度的提升不明显,对于Batch Norm没有帮助,如果要提升BN的效果,需要用Sync Bn。
原文地址:https://www.cnblogs.com/walter-xh/p/11613031.html
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 使用JMeter测试TCP协议
- SQL使用(一):如何使用SQL语句去查询第二高的值
- OpenCV加载图片显示对应类型(位深度)方法
- 小程序快速入门教程(登录注册、开发工具、文件及结构介绍)
- 面试题-统计字符出现最大次数
- pytorch中文语言模型bert预训练代码
- React环境搭建
- leetcode - 旋转数组的最小数字
- 笔记101 | 文件的压缩与解压笔记
- 诸葛亮vs司马懿,排序算法大战谁能笑到最后?
- Centos密钥登陆,解决云服务器被尝试登陆问题
- Fair Scheduler到Capacity Scheduler 转换工具
- 这可能是把SpringBoot配置文件讲解的最详细的文章了
- 抛出这8个问题,检验一下你到底会不会ThreadLocal,来摸个底~
- 最近合肥降雨不断,给自己做一个天气情况微信定时推送吧