使用Sun Grid Engine(SGE)调度GPU资源

时间:2012-05-11 19:58:09

标签: gpu gpgpu sungridengine multiple-gpu

我们有一组机器,每台机器有4个GPU。每个作业应该能够要求1-4个GPU。这就是问题所在:我希望SGE告诉每个工作它应该采用哪些 GPU。与CPU不同,如果一次只有一个进程访问GPU,则GPU效果最佳。所以我想:

Job #1  GPU: 0, 1, 3
Job #2  GPU: 2
Job #4  wait until 1-4 GPUs are avaliable

我遇到的问题是,SGE会让我在每个节点上创建一个包含4个单元的GPU资源,但它不会明确告诉作业使用哪个GPU(只有它获得1,或者3,或其他)。

我想过创建4个资源(gpu0, gpu1, gpu2, gpu3),但我不确定-l标志是否会采用glob模式,并且无法弄清楚SGE如何告诉作业哪个gpu收到的资源。有什么想法吗?

2 个答案:

答案 0 :(得分:4)

如果您有多个GPU且希望作业请求GPU但Grid Engine调度程序应处理并选择 free GPU,则可以配置RSMAP(资源映射)复合体(而不是INT)。这允许您指定主机配置中特定主机上的GPU的数量和名称。您还可以将其设置为HOST消耗品,以便独立于您的请求的插槽,使用-l cuda = 2请求的GPU设备数量是针对每个主机2的(即使并行作业得到了,即不同主机上有8个插槽) )。

qconf -mc
    #name               shortcut   type        relop   requestable consumable default  urgency     
    #----------------------------------------------------------------------------------------------
    gpu                 gpu        RSMAP         <=      YES         HOST        0        0

在执行主机配置中,您可以使用ids / names(这里只是GPU1和GPU2)初始化资源。

qconf -me yourhost
hostname              yourhost
load_scaling          NONE
complex_values        gpu=2(GPU1 GPU2)

然后,当请求-l gpu = 1时,如果GPU1已被其他作业使用,则Univa Grid Engine调度程序将选择GPU2。您可以在qstat -j输出中看到实际选择。该作业通过读取$ SGE_HGR_gpu环境变量来获取所选GPU,该变量在这种情况下包含所选的id /名称“GPU2”。这可以用于访问正确的GPU而不会发生冲突。

如果您有多插槽主机,您甚至可以将GPU直接连接到GPU附近的某些CPU内核(靠近PCIe总线),以加快GPU和CPU之间的通信速度。这可以通过在执行主机配置中附加拓扑掩码来实现。

qconf -me yourhost
hostname              yourhost
load_scaling          NONE
complex_values        gpu=2(GPU1:SCCCCScccc GPU2:SccccSCCCC)

现在,当UGE调度程序选择GPU2时,它会自动将作业绑定到第二个套接字(S)的所有4个核心(C),以便不允许作业在第一个套接字上运行。这甚至不需要-binding qsub param。

您可以在www.gridengine.eu找到更多配置示例。

请注意,所有这些功能仅适用于Univa Grid Engine(8.1.0 / 8.1.3及更高版本),而不适用于SGE 6.2u5和其他Grid Engine版本(如OGE,Sun Grid of Grid Engine等) 。您可以通过从univa.com下载48核有限免费版来试用它。

答案 1 :(得分:1)

如果您正在使用其他一种Grid Engine变体,您可以尝试调整我们在群集上使用的脚本: https://github.com/UCL/Grid-Engine-Prolog-Scripts