限制对Cuda和OpenCL资源的访问

3
我们希望扩展我们的批处理系统以支持GPU计算。
问题在于从批处理系统的角度来看,GPU是一种资源。我们可以很容易地计算使用的资源,但我们还需要限制对它们的访问。
对于GPU而言,这意味着每个作业独占一个GPU(当请求GPU时)。
据我所知,共享GPU之间的作业是一个非常糟糕的想法(因为作业的GPU部分可能会被随机杀死)。
因此,我需要一些方法来限制CUDA和OpenCL的GPU访问。批处理系统具有根权限。我可以使用cgroups限制/dev/中设备的访问,但我认为在这种情况下这不足够。
理想状态是,作业只能看到它所请求的GPU,并且这些GPU不能被任何其他作业访问。

为什么不能在运行作业时更改/dev/nvidiax设备的所有权,并提供检查以查看谁拥有它,然后再尝试运行? - Marm0t
@Marm 我可以轻松禁止该作业访问 /dev/something。这样就足够了吗? - Šimon Tóth
将/dev/nvidia的所有权更改为不同的用户,然后在运行作业之前对所有权进行检查应该就足够了。我通过网络使用nvidia GPU,有时人们会在本地登录到这些机器上,当他们这样做时,所有权会被更改,我无法访问nvidia设备。您可能希望以具有sudo访问权限的非特权用户身份运行作业以chown /dev/nvidia - 这可能有效。 - Marm0t
3个回答

4

目前有两个相关机制:

  • 使用nvidia-smi将设备设置为独占模式,这样一旦一个进程拥有了GPU,其他进程就无法附加到同一GPU。
  • 使用CUDA_VISIBLE_DEVICES变量限制进程查找GPU时看到的GPU。

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

据我所知,共享GPU对于作业来说是一个非常糟糕的主意(因为作业的GPU部分可能会被随机杀死)。

实际上,共享GPU之所以是一个坏主意,主要原因在于它们将竞争可用内存,进程可能全部失败,即使实际上其中一个进程可以继续进行。此外,它们还会竞争DMA和计算引擎的访问,可能导致整体性能差。


啊,CUDA_VISIBLE_DEVICES是我忘记的一件事情,非常有用。 - Edric

1

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

  1. 通过nvidia-smi工具将GPU设置为“计算独占”模式
  2. 告诉用户使用无参的“cudaSetDevice()”调用,它会自动选择一个未使用的GPU
  3. 指导用户使用除了cudaSetDevice之外的其他方法来初始化设备,详见"最佳实践指南"第8.3节

对于OpenCL,我不确定如何实现这一点。


好的,这有点帮助。如果请求已经使用的显卡,cudaSetDevice在独占模式下会失败吗?不幸的是,它没有解决一台机器上不同显卡的问题,并且也没有禁止用户获取比他请求的更多的显卡。 - Šimon Tóth
是的,如果独占模式GPU已经在使用中,cudaSetDevice()会失败。 - Edric
重新阅读最佳实践指南的部分内容——没有“无参数cudaSetDevice”。 - Edric

0
我开发了一个库,用于对可用的OpenCL平台和设备进行排序。它将在平台上选择最佳设备,并尝试在其上创建上下文。如果失败,则转到列表中的下一个设备。列表按计算单元数量排序。
它支持nvidia(gpu)、amd(gpu和cpu)、intel(cpu)和apple(gpu和cpu)。
有一种独占访问的锁定机制,但并不是最好的。我仍在寻找更好的解决方案。基本上,它会将使用的平台+设备保存在/tmp中的文件中。
这是我们实验室使用的内容。它遵循GPLv3协议,并可以在github上找到:https://github.com/nbigaouette/oclutils/

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接