CUDA_VISIBLE_DEVICES
flyfish
CUDA_VISIBLE_DEVICES 是一个环境变量,它用于控制哪些 GPU 设备对 CUDA 应用程序可见。通过设置这个环境变量,可以指定应用程序可以使用的特定 GPU,而忽略其他。
当你在命令行中使用 export CUDA_VISIBLE_DEVICES=0,1,2,3
或者 export CUDA_VISIBLE_DEVICES=0,3
时,你实际上是在告诉CUDA应用程序哪些GPU设备是可见的。这个环境变量的作用范围取决于你在什么地方设置了它。
示例
情景一:设置为 0,1,2,3
export CUDA_VISIBLE_DEVICES=0,1,2,3
- 含义:这行命令使得编号为0、1、2和3的GPU对随后启动的所有CUDA应用程序可见。
- 效果:如果系统中有4个或更多GPU,并且运行了一个CUDA程序(比如一个深度学习训练脚本),那么该程序将只能看到并使用这些编号的GPU。这意味着即使你的系统中有其他GPU,它们也不会被此CUDA程序使用。
情景二:设置为 0,3
export CUDA_VISIBLE_DEVICES=0,3
- 含义:这行命令使得只有编号为0和3的GPU对随后启动的所有CUDA应用程序可见。
- 效果:同样的,任何CUDA应用程序现在只能访问这两个指定的GPU。值得注意的是,尽管在物理上GPU可能位于位置1和2,但一旦设置了
CUDA_VISIBLE_DEVICES=0,3
,CUDA应用程序会认为它有两个GPU可用,分别是编号0和1,其中编号0对应实际的GPU 0,而新的编号1对应实际的GPU 3。
实际应用示例
假设你有一个机器学习模型训练任务想要在两块特定的GPU上运行,你可以这样做:
# 在开始训练之前设置可见的GPU
export CUDA_VISIBLE_DEVICES=0,3
# 然后运行你的训练脚本
python train_model.py
在这个例子中,train_model.py
脚本将只能看到并且能够利用编号为0和3的GPU进行计算。
概念
- 逻辑索引与物理索引的区别:当设置了
CUDA_VISIBLE_DEVICES
后,CUDA 应用程序将会根据你提供的索引来重新映射GPU。例如,在CUDA_VISIBLE_DEVICES=0,3
的情况下,虽然实际的GPU是0号和3号,但在CUDA应用程序看来,它们变成了0号和1号GPU。这种重映射可以帮助管理多GPU系统的资源分配,避免不同进程之间的冲突。
设置永久生效
上面的例子展示了如何临时设置 CUDA_VISIBLE_DEVICES
,即只影响当前shell会话中的后续命令。如果想设置永久生效,可以将这些命令添加到 .bashrc
文件中。
.bashrc
是 Bash shell 的一个配置文件,它通常位于用户主目录下(即 ~/.bashrc
)。这个文件包含了当启动一个新的非登录交互式 Bash shell 时会自动执行的命令。也就是说,每次打开一个新的终端窗口或标签页时,如果你使用的是 Bash shell,那么 .bashrc
文件中的命令就会被执行。
在 .bashrc
文件中可以定义和设置各种各样的环境变量、别名(aliases)、函数以及自定义提示符等。这使得可以个性化你的shell体验,添加常用的命令缩写,或者设定特定于用户的环境配置。
如何编辑和应用 .bashrc
-
编辑:
- 使用喜欢的文本编辑器来编辑
.bashrc
文件。例如,使用 nano 编辑器,可以运行以下命令:nano ~/.bashrc
- 在
.bashrc
文件中添加或修改你需要的内容。比如,如果想添加一个新的别名,你可以这样写:alias ll='ls -la'
- 使用喜欢的文本编辑器来编辑
-
重新加载:
- 完成编辑后,保存文件并退出编辑器。
- 为了让新的更改生效,需要重新加载
.bashrc
文件。可以通过运行以下命令来做到这一点:
或者更简洁地使用:source ~/.bashrc
. ~/.bashrc
-
验证更改:
- 你可以通过尝试新设置的功能来验证它们是否正确工作。例如,如果你添加了一个别名,现在应该可以在终端中使用它了。
-
永久性:
- 因为
.bashrc
文件是在每次启动新的 Bash shell 时自动读取的,所以你在其中所做的任何更改都会成为永久性的,只要该文件没有被覆盖或删除。
- 因为
-
注意事项:
- 确保不要破坏现有的配置。如果不确定如何做更改,最好先备份原始的
.bashrc
文件。 - 如果你遇到问题,如命令行行为异常,可以检查最近对
.bashrc
的修改以排查问题。
- 确保不要破坏现有的配置。如果不确定如何做更改,最好先备份原始的
-
与 CUDA_VISIBLE_DEVICES 结合使用:
- 如果你想让
CUDA_VISIBLE_DEVICES
的设置对于所有新的 Bash shell 永久有效,可以在.bashrc
中添加一行来导出这个环境变量。例如,要使第0号GPU可见,可以添加如下行:export CUDA_VISIBLE_DEVICES=0
- 如果你想让