单机多GPU的训练及debug中vscode下launch.json内容设置

1.预配置

Local_rank:当前机子上的第几块GPU。这里设置为-1,后续多线程自动分配显卡。

Cuda_visible_devices:指定分配资源到几块显卡上,这里‘0,1,2,3’就是这四张gpu的id。

os.environ['LOCAL_RANK'] = '-1'
os.environ['CUDA_VISIBLE_DEVICES'] = '0,1,2,3'

2.初始化

其实是一个多线程的过程,开3张GPU就是开了三个进程,每一个进程各自独立。

这块代码就是一个线程:

1-2行:自动获得当前线程gpu的id,并配置到cuda中。

3-4行:初始化分布式训练,nccl是后端通信方式。

因为是单机,init_process_group()中其他不需要了,写多了容易端口冲突报错。

5: 获得当前线程的gpu的id。

6: 不同进程之间的同步,同步后运行后面的程序。

gpu = int(os.environ['LOCAL_RANK'])
torch.cuda.set_device(gpu)
dist_backend = 'nccl'
torch.distributed.init_process_group(backend=dist_backend)
device_id = torch.distributed.get_rank()
torch.distributed.barrier()

3.模型分配

三个线程每一个线程都有一个模型,将模型分配到当前线程的gpu_id。

broadcast_buffers=False:这里设置缓冲区不同步,

因为在后面每一个epoch结束后用了torch.distributed.barrier()来同步各个进程。

find_unused_parameters=True:减少无用梯度计算。

model = model.to(device_id)
model = torch.nn.parallel.DistributedDataParallel(model, device_ids=[device_id], broadcast_buffers=False, find_unused_parameters=True)

4.数据分配

1.创建数据samper

num_replicas=num_tasks:共有三张GPU,三个进程三份副本。

rank=device_id:当前分配的gpu_id。

2.创建dataloader

pin_memory=True:数据转移到GPU中速度就会快一些,吃显存。

num_workers=[3]:加速数据装载,吃内存。

num_tasks = torch.distributed.get_world_size()
sampler = torch.utils.data.DistributedSampler(dataset, num_replicas=num_tasks, rank=device_id, shuffle=shuffle)
loader = DataLoader(dataset,batch_size=bs,num_workers=[4],pin_memory=True,sampler=sampler,shuffle=shuffle,collate_fn=[None],drop_last=drop_last,)              

5.训练

每训练完一轮迭代同步一下。

for e in epochs:
....torch.distributed.barrier()

最后,在terminal运行。nproc_per_node=4就是有四张gpu。

python -m torch.distributed.launch --nproc_per_node=4 --use_env main.py

6.debug的vscode下的launch.json内容 

 比如我的训练指令为:

python -m torch.distributed.launch --nproc_per_node=3 --use_env dark.py --sim --experiment dark_img

注:其中训练用3张GPU,  dark.py 是运行程序,而--sim 和--experiment dark_img是要传入的2个参数,下面的dark.py在darkening文件夹下,darkening文件夹是.vscode的统计文件夹,则完整launch.json内容如下:

{"version": "0.2.0","configurations": [{"name": "Python 调试程序: debug","type": "python","request": "launch","program": "/opt/conda/lib/python3.8/site-packages/torch/distributed/launch.py", "args": ["--nproc_per_node=3","--use_env","${workspaceFolder}/darkening/dark.py","--sim","--experiment", "dark_img"],"console": "integratedTerminal","justMyCode": true,"cwd": "${workspaceFolder}",}

参考:

单机多GPU训练 - 知乎 (zhihu.com)

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

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

相关文章

rust可变全局静态数组用法

extern crate alloc; use alloc::vec::Vec; use core::mem::ManuallyDrop; use log::info; use uefi::println; pub static mut gbuf:&static mut [i32] &mut [0; 0x1000]; pub fn testdumphex() -> i32 { info!(“testdumphex!”); let mut hexvec Vec::new();…

农村公交与异构无人机协同配送优化

针对农村公交与异构无人机协同配送的优化问题,可以从以下几个方面进行探讨: 1. 融合公交与无人机配送 公交物流体系:利用农村公交网络,建立以公交车辆为基础的物流配送体系。公交车辆可以沿途收集或投递货物,提高物流配送效率。无人机辅助配送:在公交物流体系的基础上,…

Linux学习系列文件管理之输出与重定向

在 Linux 中有三个经常用到的输入输出流,他们分别是: 标准输入(stdin)标准输出(stdout)标准错误(stderr) 在 Linux 系统中,系统保留了 0(标准输入&#xff…

C语言/数据结构——每日一题(反转链表)

一.前言 大家好!今天又是每日一题环节。今天我为大家分享了一道单链表题——反转链表。 废话不多说,让我们直接进入正题吧。 二.正文 1.1题目信息 这是一道leetCode上面的一道题:https://leetcode.cn/problems/reverse-linked-list 1.2解…

2.2 Java全栈开发前端+后端(全栈工程师进阶之路)-前端框架VUE3-基础-Vue基本语法

文本渲染指令 文本渲染指令-v-html与v-text Vue使用了基于HTML的模板语法,允许开发者声明式地将DOM绑定至底层Vue实例的数据。所有Vue的模板都是 合法的HTML,所以能被遵循规范的浏览器和HTML解析器解析。 在前面,我们一直使用的是字符串插…

Java面试八股之强软弱虚引用的概念及区别

Java中强软弱虚引用的概念及区别 在Java中,强引用、软引用、弱引用和虚引用是四种不同类型的引用,它们在对象生命周期管理、垃圾收集(Garbage Collection, GC)以及内存管理方面有着不同的行为和用途。以下是它们的概念和主要区别…

Java 中的自定义排序实现方法

文章目录 Java 中的自定义排序实现方法1. 使用自定义比较器对数组进行排序1.1 实现Comparator接口1.2 使用Arrays.sort()方法1.3 匿名内部类1.4 代码结果 2. 使用自定义比较器对集合进行排序2.1 实现Comparable接口2.2 使用Collections.sort()方法2.3 使用Lambda表达式2.4 代码…

2.Neo4j的搭建启动

Graph Database 图数据库 版本对应关系 官网都是高版本,推荐使用下载地址可以找到社区老版本: https://we-yun.com/doc/neo4j/ neo4j.bat 启动脚本 cypher-shell.bat 执行CQL语句的。 import文件夹可以放入excel,csv等数据文件,导入到…

llamaindex 中GPTVectorStoreIndex 和 VectorStoreIndex区别

在 llama_index 库中,GPTVectorStoreIndex 和 VectorStoreIndex 都是用于创建向量存储索引的类,但它们在某些方面有所不同。 底层模型: GPTVectorStoreIndex 使用 GPT (Generative Pre-trained Transformer) 模型来生成文本的向量表示。它利用 GPT 模型的上下文理解能力来捕获…

多模态大语言模型和 Apple 的 MM1

原文地址:multimodal-large-language-models-apples-mm1 2024 年 4 月 13 日 抽象是计算机科学中最关键的概念之一,具有一些最强大的影响。从简单的角度来看,抽象就是将某一事物应用于多种不同情况的能力。例如,如果你创造了一种…

本地大语言模型LLM的高效运行专家 | Ollama

Ollama简介 Ollama是一个开源的大型语言模型服务工具,它帮助用户快速在本地运行大模型。通过简单的安装指令,用户可以执行一条命令就在本地运行开源大型语言模型,如Llama 2。Ollama极大地简化了在Docker容器内部署和管理LLM的过程&#xff0…

JAVA面试专题-微服务篇

Spring cloud Spring Cloud 5大组件有哪些 注册中心/配置中心:nacos 负载均衡:Ribbon 服务远程调用:Feign 服务保护:sentinel 服务网关:Gateway 微服务注册和发现 nacos和eureka的区别 负载均衡 微服务向Ribbon发送…

基于Spring Boot的校园疫情防控系统设计与实现

基于Spring Boot的校园疫情防控系统设计与实现 开发语言:Java框架:springbootJDK版本:JDK1.8数据库工具:Navicat11开发软件:eclipse/myeclipse/idea 系统部分展示 管理员登录首页界面图,管理员进入校园疫…

Android --- 消息机制与异步任务

在Android中,只有在UIThread(主线程)中才能直接更新界面, 在Android中,长时间的工作联网都需要在workThread(分线程)中执行 在分线程中获取服务器数据后,需要立即到主线程中去更新UI来显示数据, 所以,如…

手撕spring框架(2)

相关系列 java中spring底层核心原理解析(1)-CSDN博客 java中spring底层核心原理解析(2)-CSDN博客 手撕spring框架(1)-CSDN博客 手撕spring框架(3)-CSDN博客 手撕spring框架(4)-CSDN博…

用龙梦迷你电脑福珑2.0做web服务器

用龙梦迷你电脑福珑2.0上做web服务器是可行的。已将一个网站源码放到该电脑,在局域网里可以访问网站网页。另外通过在同一局域网内的一台windows10电脑上安装花生壳软件,也可以在外网访问该内网服务器网站网页。该电脑的操作系统属于LAMP。在该电脑上安装…

Qt Creator导入第三方so库和jar包——Qt For Android

前言 之前了解了在Android Studio下导入so库和jar包,现在实现如何在Qt上导入so库和jar包。 实现 下面是我安卓开发(需调用安卓接口的代码)的目录(图1),此目录结构和原生态环境(Android Studi…

详细分析Java中的脱敏注解(附Demo)

目录 前言1. 基本知识2. 核心逻辑3. Demo4. 模版 前言 对于隐私信息,需要做特殊处理,比如身份证或者手机号等 对于Java的相关知识推荐阅读:java框架 零基础从入门到精通的学习路线 附开源项目面经等(超全) 1. 基本知…

软件定义汽车落地的五大关键要素

1、架构升级 1.1 软件架构:分层解耦、服务化、API 接口标准化 随着企业向软件定义汽车开发方法的转变,软件架构也需要同步进行升级,引入面向服务的架构(Service-Oriented Architecture,简称 SOA)方法论。…

LeetCode刷题之买卖股票的最佳时机

文章目录 1. 买卖股票的最佳时机1.1 描述1.2 分析1.3 解答 2.买卖股票的最佳时机II2.1 描述2.2 分析2.3 解答2.4 拓展2.5 拓展二 1. 买卖股票的最佳时机 题121 买卖股票的最佳时机 1.1 描述 给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 …