环境变量 是你的CUDA_VISIBLE_DEVICES
朋友。
我假设您打开的终端与 GPU 的数量一样多。假设您的应用程序被调用myexe
然后在一个终端中,您可以执行以下操作:
CUDA_VISIBLE_DEVICES="0" ./myexe
在下一个终端:
CUDA_VISIBLE_DEVICES="1" ./myexe
等等。
然后第一个实例将在 CUDA 枚举的第一个 GPU 上运行。第二个实例将(仅)在第二个 GPU 上运行,依此类推。
假设 bash,对于给定的终端会话,您可以通过导出变量来使其“永久”:
export CUDA_VISIBLE_DEVICES="2"
此后,在该会话中运行的所有 CUDA 应用程序将仅观察第三个枚举 GPU(枚举从 0 开始),并且它们将观察该 GPU ,就好像它是其会话中的设备 0。
这意味着您不必为此方法对应用程序进行任何更改,假设您的应用程序使用默认 GPU 或 GPU 0。
您还可以扩展它以使多个 GPU 可用,例如:
export CUDA_VISIBLE_DEVICES="2,4"
意味着通常枚举为 2 和 4 的 GPU 现在将是该会话中唯一“可见”的 GPU,它们将枚举为 0 和 1。
在我看来,上述方法是最简单的。选择“未使用”的 GPU 是有问题的,因为:
- 我们需要一个“使用中”的定义
- 在特定时刻使用的 GPU 在此之后可能不会立即使用
- 最重要的是,未“使用中”的 GPU 可能会异步变为“使用中”,这意味着您将面临竞争条件。
因此,最好的建议 (IMO) 是明确管理 GPU。否则,您需要某种形式的作业调度程序(在这个问题的范围之外,IMO)能够查询未使用的 GPU 并在另一个应用程序尝试这样做之前以有序的方式“保留”一个。