限制对Cuda和OpenCL资源的访问

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

问题是,从批处理系统的angular度来看,GPU是一种资源。 我们可以轻松计算使用的资源,但是我们也需要限制对它们的访问。

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

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

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

理想的状态是如果工作只能看到尽可能多的GPU,并且这些工作不能被任何其他工作访问。

目前有两种相关的机制:

  • 使用nvidia-smi将设备设置为独占模式,这种方式一旦进程有一个GPU,其他进程不能附加到同一个GPU。
  • 使用CUDA_VISIBLE_DEVICES变量来限制进程在查找GPU时看到哪些GPU。

后者当然受到虐待,但现在是一个开始。

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

实际上,共享GPU是一个坏主意的主要原因是,他们将不得不争夺可用内存,这个过程可能都会失败,尽管事实上其中一个本来可以进行的。 此外,他们争夺访问DMA和计算引擎,可能会导致整体性能不佳。

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

  1. 通过nvidia-smi工具将GPU设置为“Compute Exclusive”模式
  2. 指导用户使用no-args“cudaSetDevice()”调用,它将自动选择一个未使用的GPU
  3. 指示用户使用除cudaSetDevice以外的其他初始化设备的方法,如“最佳实践指南”第8.3节所述

我不知道如何实现OpenCL的这一点。

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

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

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

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