目前,我正面临着将GPU服务器集成到现有的SGE环境中的问题。 使用谷歌,我发现了一些集群的例子,但是没有提供这方面的信息。
在这里有什么forms的howto或教程? 它不必是超详细的,但它应该包含足够的信息,以获得“cuda队列”启动和运行…
提前致谢…
编辑:为了build立一个负载传感器,了解节点中有多less个GPU是免费的,我做了以下工作:
#!/ bin / sh的
hostname =`uname -n`
而[1]; 做
读取input
结果= $?
如果[$ result!= 0]; 然后
出口1
科幻
如果[“$ input”==“quit”]; 然后
退出0
科幻
smitool =`哪个nvidia-smi`
结果= $?
如果[$ result!= 0]; 然后
gpusav = 0
的GPU = 0
其他
gpustotal =`nvidia-smi -L | wc -l`
gpusused =`nvidia-smi | grep“进程名称”-A 6 | grep -v + - | grep -v \ | = | grep -v用法| grep -v“不运行”| wc -l`
gpusavail =`echo $ gpustotal- $ gpusused | bc`
科幻
回声开始
回声“$主机名:gpu:$ gpusavail”
回声结束
DONE
退出0
注意:这显然只适用于NVIDIA GPU
这个策略其实很简单。
使用qconf -mc可以创build一个名为gpu的复杂资源(或者任何你想要命名的资源)。 资源定义应该如下所示:
#name shortcut type relop requestable consumable default urgency #---------------------------------------------------------------------------------------------- gpu gpu INT <= YES YES 0 0
然后,您应该使用qconf -me编辑您的exec主机定义,以在具有这些主机的主机上设置GPU的数量:
hostname node001 load_scaling NONE complex_values gpu=2 user_lists NONE xuser_lists NONE projects NONE xprojects NONE usage_scaling NONE report_variables NONE
现在您已经设置了您的exec主机,您可以在提交作业时请求gpu资源。 例如: qsub -l gpu=1 ,gridengine会跟踪有多lessGPU可用。
如果您使用GPU的每个节点上运行多个作业,则可能希望将GPU放入独占模式。 你可以用nvidia-smi工具来做到这一点。
Open Grid Engine在2011.11版本中增加了GPU负载传感器支持,而不需要nvidia-smi。 nvidia-smi应用程序的输出结果可能会(也会)在驱动程序版本之间发生变化,所以不推荐使用其他方法。
如果您有GE2011.11源代码树,请查找:dist / gpu / gpu_sensor.c
编译负载传感器(需要在系统上安装CUDA工具包):
%cc gpu_sensor.c -lnvidia-ml
如果您只想交互式地查看载荷传感器报告的状态,请编译:
-DSTANDALONE
要在Grid Engine群集中使用负载传感器,只需遵循标准负载传感器设置步骤:
资料来源:
如果您有多个GPU,并且您希望作业请求GPU,但Grid Engine调度程序应该处理并select一个免费的 GPU,则可以configuration一个RSMAP(资源图)复合体(而不是INT)。 这使您可以指定主机configuration中特定主机上的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
在执行主机configuration中,您可以使用ids / names(这里仅仅是GPU1和GPU2)初始化您的资源。
qconf -me yourhost hostname yourhost load_scaling NONE complex_values gpu=2(GPU1 GPU2)
然后当请求-l gpu = 1时,Univa Grid Engine调度程序将selectGPU2,如果GPU1已经被不同的作业使用。 你可以在qstat -j输出中看到实际的select。 作业通过读取$ SGE_HGR_gpu环境variables来获取选定的GPU,其中包含所选的ID /名称“GPU2”。 这可以用于访问正确的GPU而不会发生冲突。
如果您有多插槽主机,您甚至可以将GPU直接连接到GPU附近的某些CPU核心(PCIe总线附近),以便加速GPU与CPU之间的通信。 这可以通过在执行主机configuration中附加拓扑掩码来实现。
qconf -me yourhost hostname yourhost load_scaling NONE complex_values gpu=2(GPU1:SCCCCScccc GPU2:SccccSCCCC)
现在,当UGE调度器selectGPU2时,它自动将作业绑定到第二个套接字(S)的所有4个核心(C),以便作业不被允许在第一个套接字上运行。 这甚至不需要绑定qsub参数。
更多configuration示例,请访问www.gridengine.eu 。
请注意,所有这些function仅适用于Univa Grid Engine(8.1.0 / 8.1.3及更高版本),而不适用于SGE 6.2u5和其他Grid Engine版本(如OGE,Grid Engine的Sun)。 您可以通过从univa.com下载48核有限的免费版本来试用。
对于ROCKS 6.1自带的SGE 2011.11,我发现将复杂的耗材设置为:
#name shortcut type relop requestable consumable default urgency #---------------------------------------------------------------------------------------------- gpu gpu INT <= YES JOB 0 0
这使我可以设置每个节点的GPU数量,当我提交作业时,所请求的GPU数量不依赖于SMP / SLOT计数。 然后,我可以使用每个作业8个CPU和4个GPU,而不会导致其他作业泄漏问题。我仍然必须为节点设置消耗品,如上所述。
这不像其他一些解决scheme那么好,但我发现RSMAP选项在SGE 2011.11中不可用。 我想最终得到这样的configuration,因为我可以设置哪些GPU使用。
希望这可以帮助人们节省几个小时的configuration。