Training Technology One : Distribution

文章目录

  • 训练命令
  • 初始化
    • 获得分布式参数
    • 设定GPU
    • 初始化
    • 同步
    • 输出控制(非常规流程,技巧)*
    • 分布式判断(非常规流程,技巧)*
  • 数据集
  • 模型
  • 训练

本节内容以BLIP的分布式训练代码为蓝本介绍分布式训练的过程.

本文采用DDP作为分布式框架, 库为torch.distributed.

训练命令

python -m torch.distributed.launch <分布式参数> <文件名> <文件参数>

常用的分布式参数有:

  1. nnodes : 节点的数量;
  2. node_rank : 节点的序号;
  3. nproc_per_node : 节点中显卡的数量.

通常我们采用单机多卡的模式,故只用传输第三个参数.

当命令下发之后, 其会创建一些环境变量, 即os.environ的参数:

  1. WORLD_SIZE: os.environ["WORLD_SIZE"], 所有进程的数量;
  2. LOCAL_RANK:os.environ["LOCAL_RANK"], 每张显卡在自己主机中的序号;
  3. RANK:os.environ["RANK"], 进程的序号, 通常1个GPU对应一个进程.

不同的卡上共享脚本,但是采样的数据,以及local_rank有所不同.

初始化

获得分布式参数

最重要的是得到local_rank, 这可以通过命令行的方式获得.

从torch1.10开始,官方建议使用环境变量的方式来获取local_rank, 在后期版本中,会移除命令行的方式。

if 'RANK' in os.environ and 'WORLD_SIZE' in os.environ:args.rank = int(os.environ["RANK"])args.world_size = int(os.environ['WORLD_SIZE'])args.gpu = int(os.environ['LOCAL_RANK'])
elif 'SLURM_PROCID' in os.environ:args.rank = int(os.environ['SLURM_PROCID'])args.gpu = args.rank % torch.cuda.device_count()
else:print('Not using distributed mode')args.distributed = Falsereturn

设定GPU

torch.cuda.set_device(args.gpu)

在进程内部设定可见的GPU, 这样 to('cuda')即可.

初始化

torch.distributed.init_process_group(
backend,
init_method,
world_size,
rank
)

backend表示后端方式, 对于GPU的分布式训练选择NCCL, 对于CPU的分布式训练选择GLOO.
init_method表示初始化方法:

  1. init_method='tcp://ip:port': 通过指定rank 0(即:MASTER进程)的IP和端口,各个进程进行信息交换。 需指定 rank 和 world_size 这两个参数。
  2. init_method='file://path':通过所有进程都可以访问共享文件系统来进行信息共享。需要指定rank和world_size参数。
  3. init_method=env://:从环境变量中读取分布式的信息(os.environ),主要包括 MASTER_ADDR, MASTER_PORT, RANK, WORLD_SIZE。 其中,rank和world_size可以选择手动指定,否则从环境变量读取。

一般选择env://.

同步

torch.distributed.barrier

在分布式训练过程中,多个进程需要进行数据的同步和通信。torch.distributed.barrier函数可以用来实现进程的同步,确保所有进程达到一个统一的同步点后再继续执行后续的代码。

输出控制(非常规流程,技巧)*

def setup_for_distributed(is_master):"""This function disables printing when not in master process"""import builtins as __builtin__builtin_print = __builtin__.printdef print(*args, **kwargs):force = kwargs.pop('force', False)if is_master or force:builtin_print(*args, **kwargs)__builtin__.print = print
setup_for_distributed(args.rank == 0)        

分布式判断(非常规流程,技巧)*

  1. 设定flag, 详情见上文代码;
  2. torch.ditributed.is_available()+torch.distributed.is_initialized()

数据集

dataset的格式不变, 重点考虑采样器的设计.

torch.utils.data.DistributedSampler(
dataset,
num_replicas,		# 总进程数
rank,						# 当前进程等级
shuffle,
seed,
drop_last				# 是否丢弃数据的尾部
)

对train, 我们将shuffle设为True, 反之为False.

模型

model_without_ddp = model
if args.distributed:model = torch.nn.parallel.DistributedDataParallel(model, device_ids=[args.gpu])model_without_ddp = model.module   

分布式封装的模型用于训练, 反之用于测试及存储.

训练

注意事项-1: 采样

train_loader.sampler.set_epoch(epoch)

注意事项-2: 只对主进程的模型进行测试与保存

注意事项-3: 每一个epoch后添加torch.distributed.barrier()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/50346.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Docker搭建LNMP----(超详细)

目录 ​编辑 一、项目环境 1.1 所有安装包下载&#xff1a; 1.3 服务器环境 1.4任务需求 二、Ngin 2.1、建立工作目录 2.2 编写 Dockerfile 脚本 2.3准备 nginx.conf 配置文件 2.4生成镜像 2.5创建自定义网络 2.6启动镜像容器 2.7验证 nginx、 三、Mysql 3.1建立…

http请求中token和cookie有什么区别? 连环问:session和JWT那个更好? 连环问:如何实现SSO单点登录?

参考地址:SameSite cookies explained cookie: 1. HTTP无状态,每次请求都要带cookie,以帮助识别身份 2. 服务端也可以向客户端set-cookie, cookie大小限制4kb 3. 默认有跨域限制:不可跨域共享、传递cookie cookie本地存储: 1. HTML5之前 cookie 常被用于本地存储 …

APEX内置验证与授权管理

参考博客&#xff1a;&#xff08;真的很好的教程&#xff0c;感谢&#xff01;&#xff09; 09技术太卷我学APEX-定制页面及导航菜单权限_白龙马5217的博客-CSDN博客https://blog.csdn.net/html5builder/article/details/128816236?spm1001.2014.3001.5501 1 应用程序安全性…

海外网红营销中的创新技术与趋势:AI、AR和VR的应用探索

随着全球数字化时代的不断发展&#xff0c;互联网已经成为连接人们的桥梁&#xff0c;而社交媒体则在其中扮演着举足轻重的角色。在这个全球性的社交媒体网络中&#xff0c;海外网红以其独特的个人魅力和内容创作能力迅速崭露头角。而为了在竞争激烈的市场中脱颖而出&#xff0…

并发和并行的区别 以及什么是串行,还有同步和异步;阻塞非阻塞;还有进程、线程、协程一次说清。

。 并发和并行的区别 以及什么是串行&#xff0c;还有同步和异步&#xff1a;阻塞非阻塞&#xff1a; 并发&#xff1a;多个任务在同一个 CPU 核上&#xff0c;按细分的时间片轮流(交替)执行&#xff0c;从逻辑上来看那些任务是同时执行。并行&#xff1a;单位时间内&#xf…

BBS项目 day05 后台系统功能(首页、文章列表展示、添加文章、上传文件(uuid生成新的文件名))

一、后台功能的初始配置 1. urls.py路由分发 re_path(app02/, include(app02.urls)),2.app02/urls.py from django.urls import path, re_path, include from app02 import viewsurlpatterns [path(home/, views.home),path(article_list/, views.article_list),path(add_ar…

单片机(二)使用位移 让灯亮

一&#xff1a;硬件电路 P2 口&#xff1a; P2.0~ P2.7 是这些 I0 口 LED 阳极接 电源 &#xff0c; P20 口 为低电平 可以让 LED灯 亮 二&#xff1a;软件实现部分 两种 ① 通过循环 来展示从左 到右 #include "reg52.h"#define LED_PORT P2 // 定义单片机的P2端…

软考A计划-系统集成项目管理工程师-项目变更管理

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例点击跳转>软考全系列点击跳转>蓝桥系列 &#x1f449;关于作者 专注于Android/Unity和各种游…

Jackson 实现 JSON 字段类型处理器

1.处理过程 1.1 实体类设为autoResultMap true TableName(value "table1", autoResultMap true)1.2 字段 typeHandler JacksonTypeHandler.class ApiModelProperty(value "明细")TableField(value "detail", typeHandler JacksonTypeHa…

【Spring Boot】Spring Boot整合多数据源

文章目录 前言一、基本概念1.1 什么是多数据源&#xff1f;1.2 为什么要使用多数据源&#xff1f; 二、如何在 Spring Boot 中整合多数据源&#xff1f;2.1 基本配置2.2 项目代码2.3 注意事项 前言 在实际的开发工作中&#xff0c;我们经常会遇到需要整合多个数据源的情况&…

Nginx使用keepalived配置VIP

VIP常用于负载均衡的高可用&#xff0c;使用VIP可以给多个主机绑定一个IP&#xff0c;这样&#xff0c;当某个负载应用挂了之后&#xff0c;可以自动切到另一个负载。 我这里是在k8s环境中做的测试&#xff0c;集群中有6个节点&#xff0c;我给140和141两个节点配置VIP。 1. 安…

Python土力学与基础工程计算.PDF-压水试验

Python 求解代码如下&#xff1a; 1. import math 2. 3. # 输入参数 4. L 2.0 # 试验段长度&#xff0c;m 5. Q 120.0 # 第三阶段计算流量&#xff0c;L/min 6. p 1.5 # 第三阶段试验段压力&#xff0c;MPa 7. r0 0.05 # 钻孔半径&#xff0c;m 8. 9. # 计算透…

Docker 微服务实战

1. 通过IDEA新建一个普通微服务模块 1.1 建Module docker_boot 1.2 改写pom <?xml version"1.0" encoding"UTF-8"?><project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance&…

CDN、DNS、ADN、SCDN、DCDN、ECDN、PCDN、融合CDN傻傻分不清楚,一文全部搞懂

一、CDN是什么&#xff1f; CDN的全称是Content Delivery Network&#xff0c;即内容分发网络。其基本思路是尽可能避开互联网上有可能影响数据传输速度和稳定性的瓶颈和环节&#xff0c;使内容传输得更快、更稳定。通过在网络各处放置节点服务器所构成的在现有的互联网基础之…

1267. 统计参与通信的服务器

这里有一幅服务器分布图&#xff0c;服务器的位置标识在 m * n 的整数矩阵网格 grid 中&#xff0c;1 表示单元格上有服务器&#xff0c;0 表示没有。 如果两台服务器位于同一行或者同一列&#xff0c;我们就认为它们之间可以进行通信。 请你统计并返回能够与至少一台其他服务…

算法练习(9):牛客在线编程09 双指针

package jz.bm;import jz.Interval;import java.util.ArrayList; import java.util.HashMap;public class bm9 {/*** BM87 合并两个有序的数组*/public void merge(int A[], int m, int B[], int n) {int i m - 1, j n - 1, k m n - 1;while (i > 0 || j > 0) {int a…

我是如何使用Spring Retry减少1000 行代码

使用 Spring Retry 重构代码的综合指南。 问题介绍 在我的日常工作中&#xff0c;我主要负责开发一个庞大的金融应用程序。当客户发送请求时&#xff0c;我们使用他们的用户 ID 从第三方服务获取他们的帐户信息&#xff0c;保存交易并更新缓存中的详细信息。尽管整个流程看起来…

Elasticsearch简介及安装

&#x1f353; 简介&#xff1a;java系列技术分享(&#x1f449;持续更新中…&#x1f525;) &#x1f353; 初衷:一起学习、一起进步、坚持不懈 &#x1f353; 如果文章内容有误与您的想法不一致,欢迎大家在评论区指正&#x1f64f; &#x1f353; 希望这篇文章对你有所帮助,欢…

H36M VS 3DPW datasets

1采集设备方面 H36M使用了高精度的多视角摄像机动态捕捉系统获得了非常准确和连贯的3D关节坐标标注。 3DPW使用了单目摄像机与IMU的复合传感系统进行采集,存在一定程度的标注噪声。 2场景环境方面 H36M主要针对室内定向动作,背景单一简洁。 3DPW重点是室外复杂环境中人的自…

Interlij IDEA 运行 ruoyi 后端项目。错误: 找不到或无法加载主类 com.ruoyi.auth.RuoYiAuthApplication

错误: 找不到或无法加载主类 com.ruoyi.auth.RuoYiAuthApplication 用了 IDEA运行&#xff0c;参考以下issue删除.idea目录也没有用 (官方文档写是用Eclipse运行&#xff09; 错误: 找不到或无法加载主类 com.ruoyi.auth.RuoYiAuthApplication Issue #I48N2X 若依/RuoYi-C…