我们有一组机器,每台机器有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收到的资源。有什么想法吗?
答案 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