1. 理解GPU指定运行的核心机制
在深度学习和大规模计算任务中,正确指定GPU设备是资源管理的基础技能。CUDA_VISIBLE_DEVICES环境变量是NVIDIA提供的核心控制手段,其工作原理类似于一个"设备过滤器"。当设置CUDA_VISIBLE_DEVICES="0,1"时,系统会将物理GPU 0和1映射为程序可见的cuda:0和cuda:1,而其他GPU则对程序完全不可见。
这个机制的实际效果比大多数人想象的更彻底——它不仅控制设备可见性,还会重构设备的索引编号。例如在8卡服务器上设置CUDA_VISIBLE_DEVICES="3,5"时,程序只能看到两个GPU,且它们会被重新编号为cuda:0(物理GPU3)和cuda:1(物理GPU5)。这种设计使得程序代码无需关心服务器的实际物理布局,只需处理相对设备编号。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 环境变量设置的三种实践方式
2.1 命令行直接设置(推荐方案)
在启动Python脚本前通过命令行设置是最可靠的方式:
bash复制CUDA_VISIBLE_DEVICES=0 python train.py
这种方式确保CUDA运行时初始化之前就已确定设备可见性,避免了任何潜在的初始化冲突。对于需要同时启动多个任务的情况,可以配合nohup实现后台运行:
bash复制CUDA_VISIBLE_DEVICES=0 nohup python task1.py & \
CUDA_VISIBLE_DEVICES=1 nohup python task2.py &
2.2 Python脚本内设置(需注意执行顺序)
在Python脚本中通过os.environ设置时,必须确保该操作在所有torch/cuda相关导入之前完成:
python复制import os
os.environ["CUDA_VISIBLE_DEVICES"] = "2" # 必须在所有torch导入前执行
import torch
from torch import nn
常见错误是在导入深度学习框架后才设置环境变量,此时CUDA运行时已经初始化完成,设备可见性无法再改变。我曾在一个图像分割项目中因此浪费数小时排查"为什么GPU指定无效"。
2.3 结合numactl的进阶控制
在多NU
