Pytorch基础:环境变量CUDA_VISIBLE_DEVICES

相关阅读

Pytorch基础icon-default.png?t=N7T8https://blog.csdn.net/weixin_45791458/category_12457644.html?spm=1001.2014.3001.5482


        CUDA_VISIBLE_DEVICES这个环境变量可以影响CUDA能识别到的GPU,并影响它映射到的cuda设备编号。

        首先我们知道使用nvidia-smi命令可以查询本机GPU的相关信息,如下所示。

$ nvidia-smi
Sun May 12 22:13:43 2024       
+---------------------------------------------------------------------------------------+
| NVIDIA-SMI 535.161.07             Driver Version: 535.161.07   CUDA Version: 12.2     |
|-----------------------------------------+----------------------+----------------------+
| GPU  Name                 Persistence-M | Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp   Perf          Pwr:Usage/Cap |         Memory-Usage | GPU-Util  Compute M. |
|                                         |                      |               MIG M. |
|=========================================+======================+======================|
|   0  Tesla P100-PCIE-16GB           Off | 00000000:02:00.0 Off |                    0 |
| N/A   44C    P0              79W / 250W |  12178MiB / 16384MiB |     42%      Default |
|                                         |                      |                  N/A |
+-----------------------------------------+----------------------+----------------------+
|   1  Tesla P100-PCIE-16GB           Off | 00000000:03:00.0 Off |                    0 |
| N/A   49C    P0              81W / 250W |  12214MiB / 16384MiB |     63%      Default |
|                                         |                      |                  N/A |
+-----------------------------------------+----------------------+----------------------+
|   2  Tesla P100-PCIE-16GB           Off | 00000000:82:00.0 Off |                    0 |
| N/A   35C    P0              31W / 250W |   2932MiB / 16384MiB |      0%      Default |
|                                         |                      |                  N/A |
+-----------------------------------------+----------------------+----------------------+

        可以看到我的主机有三个GPU,分别被编号为0、1、2。在下面的python代码中,我们使用pytorch.cuda模块下提供的函数,查询了本机拥有的cuda设备数量,并根据编号显示了它们的型号。

import torch

# 检查是否有可用的CUDA设备
if torch.cuda.is_available():
    # 获取设备数量
    device_count = torch.cuda.device_count()
    print("CUDA设备数量:", device_count)
    
    # 遍历每个设备并输出型号
    for i in range(device_count):
        print("CUDA设备{}型号:".format(i), torch.cuda.get_device_name(i))
else:
    print("CUDA不可用")
输出:
CUDA设备数量: 3
CUDA设备0型号: Tesla P100-PCIE-16GB
CUDA设备1型号: Tesla P100-PCIE-16GB
CUDA设备2型号: Tesla P100-PCIE-16GB

        上面的cuda设备编号,就对应着nvidia-smi命令所查询到的GPU编号,下面所示的几种方式可以将张量在指定编号的cuda设备之间转移,其中cuda:0、cuda:1、cuda:2中的数字指的就是cuda设备的编号。

import torch

tensor_1=torch.tensor([1,2,3,4,5], device='cpu')
print(tensor_1)

tensor_1=tensor_1.to('cuda:0')
print(tensor_1)
tensor_1=tensor_1.to('cuda:1')
print(tensor_1)
tensor_1=tensor_1.to('cuda:2')
print(tensor_1)

tensor_2=torch.tensor([11,22,33,44,55], device='cpu')
print(tensor_2)

tensor_2=tensor_2.to('cuda:0')
print(tensor_2)
tensor_2=tensor_2.to('cuda:1')
print(tensor_2)
tensor_2=tensor_2.to('cuda:2')
print(tensor_2)

tensor_3=torch.tensor([111,222,333,444,555], device='cpu')
print(tensor_3)

device_0=torch.device('cuda:0')
tensor_3=tensor_3.to(device_0)
print(tensor_3)
device_1=torch.device('cuda:1')
tensor_3=tensor_3.to(device_1)
print(tensor_3) 
device_2=torch.device('cuda:2')
tensor_3=tensor_3.to(device_2)
print(tensor_3)
输出:
tensor([1, 2, 3, 4, 5])
tensor([1, 2, 3, 4, 5], device='cuda:0')
tensor([1, 2, 3, 4, 5], device='cuda:1')
tensor([1, 2, 3, 4, 5], device='cuda:2')
tensor([11, 22, 33, 44, 55])
tensor([11, 22, 33, 44, 55], device='cuda:0')
tensor([11, 22, 33, 44, 55], device='cuda:1')
tensor([11, 22, 33, 44, 55], device='cuda:2')
tensor([111, 222, 333, 444, 555])
tensor([111, 222, 333, 444, 555], device='cuda:0')
tensor([111, 222, 333, 444, 555], device='cuda:1')
tensor([111, 222, 333, 444, 555], device='cuda:2')

        有了上面的基础,下面来谈谈环境变量CUDA_VISIBLE_DEVICES,在一般情况下,它是没有定义的,可以使用下面的Python代码进行检测。

import os
print(os.environ["CUDA_VISIBLE_DEVICES"])
输出:
KeyError: 'CUDA_VISIBLE_DEVICES'

        可以在Bash中使用export命令,定义环境变量CUDA_VISIBLE_DEVICES(设置变量为导出状态),有关export命令的内容,可以查看Linux:导出环境变量命令export。这种情况下,在该Bash下运行的所有python子进程,都会继承这个环境变量,如下所示。

# 以下三种方式均可以成功设置
# 仅设置GPU1、GPU2可见,且将GPU1当做cuda0设备,GPU2当做cuda1设备
$ export CUDA_VISIBLE_DEVICES='1,2'  
$ export CUDA_VISIBLE_DEVICES="1,2"
$ export CUDA_VISIBLE_DEVICES=1,2

$ export  # 查看是否成功设置环境变量
******
declare -x CUDA_VISIBLE_DEVICES="1,2" 
******

$ python
Python 3.9.18 (main, Sep 11 2023, 13:41:44) 
[GCC 11.2.0] :: Anaconda, Inc. on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import os
>>> print(os.environ["CUDA_VISIBLE_DEVICES"])
1,2
>>> import torch
>>> print("CUDA设备数量:", torch.cuda.device_count()) # 查看cuda设备数量
>>> CUDA设备数量: 2
>>> a=torch.tensor([1, 2, 3, 4, 5], device='cuda:2') # 无法使用cuda2设备
RuntimeError: CUDA error: invalid device ordinal
CUDA kernel errors might be asynchronously reported at some other API call, so the stacktrace below might be incorrect.
For debugging consider passing CUDA_LAUNCH_BLOCKING=1.
Compile with `TORCH_USE_CUDA_DSA` to enable device-side assertions.

        上例展示了,如何仅设置GPU1和GPU2可见,且将GPU1当做cuda0设备,GPU2当做cuda1设备,所以此时无法使用cuda2设备。由于环境变量CUDA_VISIBLE_DEVICES中编号的顺序也会影响cuda设备的映射编号,我们甚至可以将GPU0当做cuda2设备,GPU1当做cuda1设备,GPU2当做cuda0设备,如下所示。

$ export CUDA_VISIBLE_DEVICES='2,1,0'  

        还可以在python内部使用os模块直接设置本python进程的环境变量,如下所示。

import os
import torch
os.environ["CUDA_VISIBLE_DEVICES"]='2'  # 注意:这里必须使用字符串
print(os.environ["CUDA_VISIBLE_DEVICES"])
print("CUDA设备数量:", torch.cuda.device_count()) # 查看cuda设备数量
a=torch.tensor([1, 2, 3, 4, 5], device='cuda:1') # 无法使用cuda1设备

输出:
2
CUDA设备数量: 1
RuntimeError: CUDA error: invalid device ordinal
CUDA kernel errors might be asynchronously reported at some other API call, so the stacktrace below might be incorrect.
For debugging consider passing CUDA_LAUNCH_BLOCKING=1.
Compile with `TORCH_USE_CUDA_DSA` to enable device-side assertions.

 

 

 

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

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

相关文章

vue element checkbox的实现

实现多选非常简单: 手动添加一个el-table-column,设type属性为selection即可;默认情况下若内容过多会折行显示,若需要单行显示可以使用show-overflow-tooltip属性,它接受一个Boolean,为true时多余的内容会在 hover 时以…

实验过程演示【计算机网络实验】

前言 这是陈旧已久的草稿2023-05-20 11:23:54 这个是计算机网络的一个实验,现在也不知道这个是啥来着。 现在2024-5-12 22:33:17,发布到[计算机网络实验]专栏中。 实验过程演示 2023-5-18 20:17:45 1.搭建一个多跳网络拓扑,…

回炉重造java----多线程

概念 注: main方法其实也是一个线程。在java中所以的线程都是同时启动的,至于什么时候,哪个先执行,完全看谁先得到CPU的资源。在java中,每次程序运行至少启动2个线程。一个是main线程,一个是垃圾收集(gc )线…

Hikyuu高性能量化研究框架助力探索

Hikyuu Quant Framework 是一款基于C/Python的开源量化交易分析与研究工具,主要用于A股市场的交易策略分析与回测,目前不支持期货等,需要自行改造。 Hikyuu的目标 Hikyuu的最初目的是为了快速对A股全市场股票进行策略回测和验证&#xff0c…

[数据集][目标检测]电力场景安全帽检测数据集VOC+YOLO格式295张2类别

数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):295 标注数量(xml文件个数):295 标注数量(txt文件个数):295 标注类别…

Git之revert的使用

问题场景: 提交代码都是以merge request的形式合并到主分支master的。 由于有一个merge request被误merge了,这期间又有同时merge了其它内容。 如何快速将这个被误merge的request从master上revert呢? 实例演示: 下面是最近的5…

消息中间件Kafka(PHP版本)

小编最近需要用到消息中间件,有需要要复习一下以前的东西,有需要的自取,强调一点,如果真的想了解透彻,一定要动手,脑袋会了不代表就会写了 Kafka是由Scala和Java编写。Kafka是一种高吞吐量的分布式发布订阅…

Debian Linux 下给Nginx 1.26.0 编译增加Brotli算法支持

明月发现参考【给Nginx添加谷歌Brotli压缩算法支持】一文给出的方法,在Debian Linux 12.5下就一直编译失败,主要的错误是因为文件缺失,在专门又安装了apt-get install libbrotli-dev的依赖库后依然会因为文件缺失无法编译完成,就这…

用 Python 从头开始​​编写线性回归

找到最佳拟合线的方法是使用梯度下降,我们将随机绘制一条线,计算该线的误差 计算误差 给定m和b,我们将计算直线的误差。Eeeor用sigma表示法表示 def compute_error_for_line_given_points(b, m, points):totalError 0for i in range(0, len…

安装conda并搭建python环境(入门教程)

文章目录 1. 什么是 conda?1.1 Conda 与 Anaconda 的区别1.2 Conda 与 pip 的区别 2. 下载安装3. 配置并使用 conda3.1 配置下载源3.2 环境管理3.2.1 创建(删除)环境3.2.2 激活(切换)环境3.2.2 下载(卸载&a…

机器学习——2.损失函数loss

基本概念 损失函数也叫代价函数。损失函数就是计算预测结果和实际结果差距的函数,机器学习的过程就是试图将损失函数的值降到最小。 图左:|t_p - t_c| 图右:(t_p - t_c)**2 代码实…

[OpenGL高级光照] 阴影改善

目录 一 阴影失真 二 阴影改善 2.1 减小片段深度值 2.2 降低纹理 2.3 注意事项 三 消除Repeat的问题 3.1 让裁剪矩阵的立方体变大 ​3.2 利用采样范围重置 四 精度问题 本章节源码 点击此处 一 阴影失真 在上一篇中,实现了阴影效果之后,但是我们会发现阴影效果中地面…

47-Qt控件详解:Buttons Containers1

一 QPushButton (命令按钮) #ifndef MAINWINDOW_H #define MAINWINDOW_H#include <QMainWindow> #include <QPushButton>//引入QPushButton类对应的头文件class MainWindow : public QMainWindow {Q_OBJECTpublic:MainWindow(QWidget *parent nullptr);~MainWind…

【IMX6ULL项目】IMX6ULL下Linux实现产测工具框架

电子产品量产测试与烧写工具。这是一套软件&#xff0c;用在我们的实际生产中&#xff0c; 有如下特点&#xff1a; 1.简单易用&#xff1a; 把这套软件烧写在 SD 卡上&#xff0c;插到 IMX6ULL 板子里并启动&#xff0c;它就会自动测试各个模块、烧写 EMMC 系统。 工人只要按…

40 -1 入侵检测系统(IDS)- IDS的使用及规则

xampp 官网:XAMPP Installers and Downloads for Apache Friends 一、安装 XAMPP XAMPP 简介 XAMPP是完全免费且易于安装的Apache发行版,其中包含MariaDB、PHP和Perl。XAMPP开放源码包的设置让安装和使用出奇容易。 开始安装 如果命令行下载太慢,就在浏览器中下载完再拉…

【2024新版】龙年新版ui周易测算网站H5源码/在线起名网站源码/运势测算网站系统源码

>>>功能说明&#xff1a; 1、系统配置&#xff1a;系统基本配置、测算价格配置、在线预约配置、系统信息配置、代理分成配置、推广积分配置、VIP价格配置、账号管理 2、推广管理&#xff1a;我的信息、推广链接、订单管理、体现管理 3、付费应用&#xff0c;订单管…

高校课程评价|基于SSM+vue的高校课程评价系统的设计与实现(源码+数据库+文档)

高校课程评价系统 目录 基于SSM&#xff0b;vue的高校课程评价系统的设计与实现 一、前言 二、系统设计 三、系统功能设计 1管理员功能模块 2学生功能 3教师功能 4专家功能 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&…

Windows Docker 使用 httpd 部署静态 Web 站点

一、简介 httpd 是 Apache超文本传输协议&#xff08;HTTP&#xff09;服务器的主程序&#xff0c;是一个独立运行的后台进程&#xff0c;专门负责处理 HTTP 请求。它通过建立子进程或线程的池来高效管理请求&#xff0c;确保服务器能够迅速响应客户端的需求。httpd 因其高效率…

【Delphi】OpenCV 实战(一):OpenCV简介及开发环境配置

目录 一、OpenCV 功能模块 二、Delphi 中使用OpenCV 三、OpenCV 4.7 Delphi开发环境配置 1. 环境配置 2. OpenCV 中Demo程序的编译配置 3. 运行 Demo (OpenCV for Delphi) OpenCV 是世界上最大的计算机视觉库。 它是开源的,包含 2500 多种算法,由非营利…

信息系统项目管理师0105:项目评估与决策(7项目立项管理—7.3项目评估与决策)

点击查看专栏目录 文章目录 7.3项目评估与决策1.评估依据2.评估的程序3.项目评估的内容4.项目评估报告内容大纲记忆要点总结7.3项目评估与决策 项目评估指在项目可行性研究的基础上,由第三方(国家、银行或有关机构)根据国家颁布的政策、法规、方法、参数和条例等,从国民经济…