【踩坑】修复循环设置os.environ[‘CUDA_VISIBLE_DEVICES‘]无效

转载请注明出处:小锋学长生活大爆炸[xfxuezhagn.cn]

如果本文帮助到了你,欢迎[点赞、收藏、关注]哦~

问题示例

for gpus in ['0', '1',  '2',  '3',  '4',  '5',  '6',  '7']:
    os.environ['CUDA_VISIBLE_DEVICES'] = gpus
    print(torch.cuda.get_device_name(0))

        始终将使用第一个GPU,即CUDA:0.

问题解析

        在使用 os.environ['CUDA_VISIBLE_DEVICES'] 动态设置可见的 GPU 时,通常只能在程序开始运行之前进行设置,并且这种设置在程序运行后无法在一个进程中动态改变。这是因为深度学习框架(如 TensorFlow、PyTorch 等)在初始化时就会读取 CUDA_VISIBLE_DEVICES 环境变量,并在后续操作中使用这些设置。因此,尝试在运行时通过循环动态更改 CUDA_VISIBLE_DEVICES 是无效的

解决方法

1. 子进程方法

        通过在子进程中运行深度学习代码,每次子进程启动时重新设置 CUDA_VISIBLE_DEVICES 环境变量。在这种方法中,每次循环都会启动一个新的子进程 your_script.py,并为该子进程设置不同的 GPU。

import os
import subprocess

gpus = ['0', '1', '2']

for gpu in gpus:
    env = os.environ.copy()
    env['CUDA_VISIBLE_DEVICES'] = gpu
    subprocess.run(['python', 'your_script.py'], env=env)

2. 使用PyTorch的设备管理 (个人推荐)

        在 PyTorch 中,你可以直接通过 torch.cuda.set_device(device) 动态设置设备,而无需更改 CUDA_VISIBLE_DEVICES。这种方法在单个进程中动态设置不同的 GPU。示例如下:

import torch

gpus = [0, 1, 2]

for gpu in gpus:
    torch.cuda.set_device(gpu)
    print(torch.cuda.get_device_name(torch.cuda.current_device()))
    # 你的深度学习代码
    model = your_model.to(torch.device(f'cuda:{gpu}'))
    # 继续进行训练或推理

3. 使用多进程方法

        使用 multiprocessing 模块启动多个进程,每个进程设置不同的 GPU。这种方法启动多个独立进程,每个进程可以独立设置 CUDA_VISIBLE_DEVICES 并在其上运行代码。:

import os
from multiprocessing import Process

def run_on_gpu(gpu):
    os.environ['CUDA_VISIBLE_DEVICES'] = str(gpu)
    # 你的深度学习代码
    # 如训练、推理等

gpus = [0, 1, 2]
processes = []

for gpu in gpus:
    p = Process(target=run_on_gpu, args=(gpu,))
    p.start()
    processes.append(p)

for p in processes:
    p.join()

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

专业技能篇---计算机网络

文章目录 前言计算机网络基础一、网络分层模型 HTTP一、从输入URL到页面显示发生了什么?二、Http的状态码有哪些?三、 HTTP与HTTPS有什么区别?四、URI 和 URL 的区别是什么?五、Cookie和Session有什么区别?六、GET与POST WebSock…

期货投机的操作

期货投机是一种高风险、高回报的投资方式,吸引着众多投资者参与。将深入探讨期货专业投机的操作秘诀,帮助投资者掌握必要的知识和技巧,在期货市场中驰骋。 一、期货专业投机的本质 期货投机是利用期货合约进行买卖,以赚取差价的一…

Diffusion Mamba:用于CT到MRI转换的Mamba扩散模型

Diffusion Mamba:用于CT到MRI转换的Mamba扩散模型 提出背景拆解左侧:整体框架中间:Mamba块的细节右侧:螺旋扫描的细节 提出背景 论文:https://arxiv.org/pdf/2406.15910 代码:https://github.com/wongzbb…

JAVA【案例5-2】模拟默认密码自动生成

【模拟默认密码自动生成】 1、案例描述 本案例要求编写一个程序,模拟默认密码的自动生成策略,手动输入用户名,根据用户名自动生成默认密码。在生成密码时,将用户名反转即为默认的密码。 2、案例目的 (1&#xff09…

超简单的nodejs使用log4js保存日志到本地(可直接复制使用)

引入依赖 npm install log4js 新建配置文件logUtil.js const log4js require(log4js);// 日志配置 log4js.configure({appenders: {// 控制台输出consoleAppender: { type: console },// 文件输出fileAppender: {type: dateFile,filename: ./logs/default, //日志文件的存…

【详述】BP神经网络建模流程一步一步详述

本文来自《老饼讲解-BP神经网络》https://www.bbbdata.com/ 目录 一、BP神经网络的建模流程二、BP神经网络的建模分步讲解2.1.数据归一化2.2.数据划分2.3.网络结构设置2.4.网络训练2.5.训练效果评估 本文梳理BP神经网络的建模流程,供大家建模时进行借鉴。 一、BP神经…

循环神经网络——RNN

循环神经网络 在之前NLP基础章节-语言模型中我们介绍了 n n n 元语法,其中单词 x t x_t xt​ 在时间步 t t t 的条件概率仅取决于前面 n n n 个单词,若是想要将之前单词的影响也加入那么模型参数数量会指数级增长。但是可能之前的单词存在重要的信息…

进阶篇08——MySQL管理

系统数据库 常用工具 mysql 客户端工具 mysqladmin 执行管理操作 mysqlbinlog 数据库二进制日志转成文本 mysqlshow 数据库查找 mysqldump 数据库备份 mysqlimport/source 数据库导入

LLM大语言模型-AI大模型全面介绍

简介: 大语言模型(LLM)是深度学习的产物,包含数十亿至数万亿参数,通过大规模数据训练,能处理多种自然语言任务。LLM基于Transformer架构,利用多头注意力机制处理长距离依赖,经过预训…

Python-爬虫 下载天涯论坛帖子

为了爬取的高效性,实现的过程中我利用了python的threading模块,下面是threads.py模块,定义了下载解析页面的线程,下载图片的线程以及线程池 import threading import urllib2 import Queue import re thread_lock threading.RL…

宝塔计划任务调用node程序时,log4js日志保存本地位置会发生变化

接我上一篇文章的情况 超简单的nodejs使用log4js保存日志到本地(可直接复制使用)-CSDN博客 原本应当保存在node项目目录下的日志文件,如果使用宝塔的计划任务来定时执行的话,日志保存路径会发生变化到如下图的位置: 如…

JFrame和JScrollPanel布局初步使用

还不是很了解,做了几个程序; import java.awt.Container; import java.awt.Color; import javax.swing.JFrame; import javax.swing.JScrollPane; import javax.swing.border.EmptyBorder;public class pa1 {public static void main(String[] agrs){JF…

AWS在国内的持续受欢迎:探究背后的原因

亚马逊云(AWS)作为全球领先的云计算服务提供商,在国内市场仍然保持着强劲的竞争力和广泛的用户群。尽管国内也有一些本土云计算服务提供商的崛起,但AWS在国内仍然有大量的用户在使用。我们九河云,一直致力AWS云相关服务…

如何使用 Swift 中的 GraphQL

文章目录 前言基础知识ApolloGraphQL结论前言 我一直在分享关于类型安全和在 Swift 中构建健壮 API 的更多内容。今天,我想继续探讨类型安全的话题,介绍 GraphQL。GraphQL 是一种用于 API 的查询语言。本周,我们将讨论 GraphQL 的好处,并学习如何在 Swift 中使用它。 基础…

面试-JMM的内存可见性

1.JAVA内存模型 分析: 由于JVM运行程序的实体是线程,而每个线程创建时,JVM都会 为其创建一个工作内存(栈空间),用于存储线程私有的数据。而java内存模型中规定所有变量都存储在主内存中。主内存是共享内存区域,所有线程都可以访问…

国密SSL证书提升网络安全

随着数字化时代的到来,网络安全已经成为全球关注的焦点。在这种背景下,SSL证书作为保护数据传输安全的重要工具,其重要性日益凸显。 数字证书产品有以下几种类别: 单域名SSL证书:为单一网站提供安全保护。 多域名SS…

C++ ─── vector的实现

知识点: ① 因为vector是模版,所以声明和定义都放在.h中,防止出现编译错误 .h不会被编译,在预处理中.h在.cpp中展开所以在编译时只有.cpp 而 .cpp顺序编译,只会进行向上查找,因此至少有函数的声明。 ②memc…

【JavaEE】浅谈线程(二)

线程 线程的常见属性 线程属性可以通过下面的表格查看。 •ID 是线程的唯⼀标识,不同线程不会重复 • 名称是各种调试⼯具⽤到(如jconsoloe) • 状态表示线程当前所处的⼀个情况,下⾯我们会进⼀步说明 • 优先级高的线程理论上来…

报道 | 2024年7月-2024年9月国际运筹优化会议汇总

封面图来源: https://www.pexels.com/zh-cn/photo/1181406/ 2024年7月-2024年9月召开会议汇总: 2024 INFORMS Advances in Decision Analysis Conference (ADA) Location: Finland Important Dates: Conference: July 10-12, 2024 Details:https://w…