3

我们想扩展我们的批处理系统以支持 GPU 计算。

问题在于,从批处理系统的角度来看,GPU 是一种资源。我们可以很容易地统计使用的资源,但我们也需要限制对它们的访问。

对于 GPU,这意味着每个作业都只要求一个 GPU(当请求 GPU 时)。

据我所知,在作业之间共享 GPU 是一个非常糟糕的主意(因为作业的 GPU 部分可能会被随机终止)。

所以,我需要一些方法来限制对 CUDA 和 OpenCL 的 GPU 的访问。批处理系统具有 root 权限。我可以限制对/dev/使用设备的访问,cgroups但我认为在这种情况下这还不够。

理想状态是,如果作业只能看到它请求的 GPU 数量,并且任何其他作业都无法访问这些 GPU。

4

3 回答 3

4

目前有两种相关机制:

  • 使用 nvidia-smi 将设备设置为独占模式,这样一旦一个进程拥有一个 GPU,其他进程就不能连接到同一个 GPU。
  • 使用 CUDA_VISIBLE_DEVICES 变量来限制进程在寻找 GPU 时看到的 GPU。

后者当然会受到滥用,但现在只是一个开始。

据我所知,在作业之间共享 GPU 是一个非常糟糕的主意(因为作业的 GPU 部分可能会被随机终止)。

并非如此,共享 GPU 是一个坏主意的主要原因是它们将不得不竞争可用内存,并且这些进程可能都会失败,即使实际上其中一个进程可以继续进行。此外,它们争夺对 DMA 和计算引擎的访问权,这可能导致整体性能不佳。

于 2010-11-03T16:16:15.413 回答
1

我相信有两件事可以帮助 NVIDIA CUDA GPU:

  1. nvidia-smi通过该工具将 GPU 置于“计算独占”模式
  2. 指示用户使用无参数“cudaSetDevice()”调用,该调用将自动选择未使用的 GPU
  3. 指导用户使用除 之外的其他方式初始化设备cudaSetDevice,如“最佳实践指南”第 8.3 节所述

我不确定如何为 OpenCL 实现这一点。

于 2010-11-02T15:24:29.820 回答
0

我开发了一个库,可以对可用的 OpenCL 平台和设备进行排序。它将选择平台上最好的设备。然后它会尝试在其上创建上下文。如果失败,它将转到列表中的下一个。该列表按计算单元的数量排序。

它支持 nvidia (gpu)、amd (gpu & cpu)、intel (cpu) 和 apple (gpu & cpu)。

有用于独占访问的锁定机制。虽然它不是最好的。我仍在寻找更好的解决方案。基本上,它使用 /tmp 中使用的平台+设备保存文件。

这就是我们在实验室中使用的。它在 GPLv3 下可用,可以在 github 上找到:https ://github.com/nbigaouette/oclutils/

于 2011-07-26T01:05:03.560 回答