设置CUDA_VISIBLE_DEVICES的方法

本文详细介绍了如何通过bash脚本和Python代码设置CUDA_VISIBLE_DEVICES环境变量,以控制GPU设备的可见性,适用于深度学习框架如PyTorch和TensorFlow的多GPU配置场景。
部署运行你感兴趣的模型镜像

设置CUDA_VISIBLE_DEVICES的方法

1. 通过bash脚本设置CUDA_VISIBLE_DEVICES

export CUDA_VISIBLE_DEVICES=0,1,2,3
# 注意bash脚本中不要随意使用空格,特别是符号之后不要加空格
source ~/anaconda3/bin/activate torch
# 使用source命令读取并且执行activate,激活anaconda虚拟环境
python -c 'import torch; print(torch.__version__); print(torch.cuda.device_count())'
# 用python command模式显示pytorch版本

2. 通过os.environ来设置CUDA_VISIBLE_DEVICES

import torch
import os
os.environ['CUDA_VISIBLE_DEVICES']='0,1,2'
print(torch.cuda.device_count())

您可能感兴趣的与本文相关的镜像

PyTorch 2.5

PyTorch 2.5

PyTorch
Cuda

PyTorch 是一个开源的 Python 机器学习库,基于 Torch 库,底层由 C++ 实现,应用于人工智能领域,如计算机视觉和自然语言处理

<think>我们被要求设置CUDA_VISIBLE_DEVICES环境变量以控制PyTorch可见的GPU设备。根据引用内容,我们可以通过设置环境变量来实现。以下是几种设置方法方法1:在Python代码中设置(需在导入PyTorch之前) 引用[1]指出,必须在设置torch.backends.cudnn.benchmark之前设置CUDA_VISIBLE_DEVICES,否则更改将不起作用。因此,我们应在程序的最开始设置方法2:在命令行中设置(推荐) 引用[4]提到,在命令行运行时可以通过前置环境变量设置,如:`CUDA_VISIBLE_DEVICES=1,2python myscript.py` 方法3:在代码中设置(使用os.environ)在代码中设置环境变量,同样需要在导入PyTorch之前完成。 注意:引用[4]解释了环境变量的含义:设置的值是可见的GPU设备列表,这些值并不是GPU的物理ID,而是重新映射后的索引。例如,设置`CUDA_VISIBLE_DEVICES='1,2'`,那么在程序中可见的GPU设备将被重新编号为cuda:0(对应物理ID1)和cuda:1(对应物理ID2)。另外,引用[3]提到还可以设置`CUDA_DEVICES_ORDER`,这可以改变设备枚举的顺序(如按PCI总线顺序),但通常不需要设置。因此,我们提供以下两种常用方法:###方法一:在命令行中设置(推荐) 在运行Python脚本前,通过环境变量指定可见的GPU设备:```bashCUDA_VISIBLE_DEVICES=0,1 pythonyour_script.py```这样,在脚本中,PyTorch将只能看到设备0和设备1(物理设备),并且在程序中它们被索引为cuda:0和cuda:1。 ###方法二:在Python脚本中设置Python脚本的最开始(在任何导入PyTorch的代码之前)设置环境变量:```pythonimportosos.environ["CUDA_VISIBLE_DEVICES"] ="0,1"#设置可见的GPU设备为0和1#然后导入PyTorchimport torch```###验证设置设置后,可以通过以下代码验证可见的设备:```pythonimporttorchprint(f"可见GPU数量:{torch.cuda.device_count()}")print(f"当前设备:{torch.cuda.current_device()}") print(f"设备名称: {torch.cuda.get_device_name()}") ```###注意事项1.如果设置的环境变量包含不存在的设备ID,程序将无法看到任何GPU,因此请确保设备ID存在。 2.在代码中设置环境变量必须在导入PyTorch之前,否则可能不生效(引用[1])。 3.在多进程环境中(如使用torch.distributed),每个进程通常会通过`LOCAL_RANK`环境变量来指定其使用的设备,此时结合`CUDA_VISIBLE_DEVICES`可以灵活分配设备。###示例:在分布式训练中设置在分布式训练中,我们通常为每个进程分配一个GPU。假设我们有两块GPU,我们可以设置`CUDA_VISIBLE_DEVICES=0,1`,然后每个进程通过`LOCAL_RANK`(0或1)来选择设备。 ```pythonimport osimporttorch#设置可见设备(在分布式环境中,主脚本可能已经由命令行设置了,所以这里可以不用设置)#但如果在代码中设置,同样要放在最前面#获取当前进程的本地排名(通常由启动器设置)local_rank =int(os.environ['LOCAL_RANK'])#设置当前进程使用的设备torch.cuda.set_device(local_rank)device =torch.device("cuda", local_rank)``` ###相关问题1.如何检查PyTorch可用的GPU设备?2.在Docker容器中如何设置CUDA_VISIBLE_DEVICES?3.如何避免在代码中硬编码GPU设备?4.分布式训练中如何正确分配GPU设备?5.环境变量CUDA_VISIBLE_DEVICES与tor.cuda.set_device()有何区别?[^1]:环境变量设置需在程序顶部[^4]:环境变量设置的具体含义和命令行用法</think>### 设置 CUDA_VISIBLE_DEVICES 环境变量的方法 在 PyTorch 中设置 `CUDA_VISIBLE_DEVICES` 环境变量有两种主要方式,推荐使用第一种方法: #### 方法1:命令行设置(推荐) 在运行 Python 脚本前直接设置环境变量: ```bash # Linux/macOS CUDA_VISIBLE_DEVICES=0,1 python your_script.py # Windows set CUDA_VISIBLE_DEVICES=0,1 && python your_script.py ``` 这将使脚本只能看到 GPU 0 和 GPU 1[^4]。 #### 方法2:Python 代码中设置 在导入 PyTorch 前设置环境变量(必须放在代码最开头): ```python import os os.environ["CUDA_VISIBLE_DEVICES"] = "0,1" # 选择 GPU 0 和 1 # 必须在设置后导入 PyTorch import torch ``` **注意**:必须在导入 PyTorch 前设置,否则无效[^1]。 --- ### 使用示例 ```python import os os.environ["CUDA_VISIBLE_DEVICES"] = "1" # 仅使用 GPU 1 import torch # 验证设置 print(f"可见 GPU 数量: {torch.cuda.device_count()}") # 输出: 1 print(f"当前设备: {torch.cuda.current_device()}") # 输出: 0 (重新映射后的索引) ``` --- ### 关键注意事项 1. **索引重映射**: - 设置 `"0,1"` 后,物理 GPU 0 在代码中变为 `cuda:0`,物理 GPU 1 变为 `cuda:1`[^4] - 设置 `"1"` 后,物理 GPU 1 在代码中变为 `cuda:0` 2. **优先级规则**: - 命令行设置 > Python 代码设置 - 后设置的值会覆盖先设置的值 3. **特殊值**: ```python os.environ["CUDA_VISIBLE_DEVICES"] = "" # 禁用所有 GPU os.environ["CUDA_VISIBLE_DEVICES"] = "0,2" # 仅使用 GPU 0 和 2 ``` 4. **设备排序控制**: ```python # 按 PCI 总线顺序枚举设备(可选) os.environ["CUDA_DEVICES_ORDER"] = "PCI_BUS_ID" os.environ["CUDA_VISIBLE_DEVICES"] = "0,1" ``` 这能确保设备顺序稳定[^3]。 --- ### 验证设置效果 ```python import torch # 检查实际可见设备 print(f"可见 GPU 数量: {torch.cuda.device_count()}") for i in range(torch.cuda.device_count()): print(f"GPU {i}: {torch.cuda.get_device_name(i)}") # 尝试使用不可见设备会报错 try: torch.tensor([1]).to("cuda:2") # 如果只设置了2个GPU,索引2将无效 except RuntimeError as e: print(f"错误: {e}") ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值