我目前面临的问题是将 GPU 服务器集成到现有的 SGE 环境中。使用 Google,我找到了一些已设置此设置的集群示例,但没有关于如何完成此设置的信息。
有没有关于此内容的某种形式的操作指南或教程?它不必非常详细,但应该包含足够的信息来启动和运行“cuda 队列”...
提前致谢...
编辑:为了设置一个关于节点中有多少个 GPU 是空闲的负载传感器,我做了以下操作:
- 将 GPU 的计算模式设置为独占
- 将 GPU 设置为持久模式
- 将以下脚本作为负载传感器添加到集群配置中(并将其设置为 1 秒)
/bin/sh #!/bin/sh 复制代码 主机名=`uname -n` 当[ 1 ]时; 读取输入 结果=$? 如果 [ $result != 0 ]; 那么 出口 1 菲 如果 [ “$input” == “退出” ]; 然后 出口 0 菲 smitool=`哪个 nvidia-smi` 结果=$? 如果 [ $result != 0 ]; 那么 gpusav=0 gpus=0 别的 gpustotal =`nvidia-smi -L | wc -l` gpusused=`nvidia-smi |grep "进程名称" -A 6|grep -v +-|grep -v \|=|grep -v 用法|grep -v "未运行"|wc -l` gpusavail=`回显 $gpustotal-$gpusused|bc` 菲 回显开始 回显“$主机名:gpu:$gpusavail” 回音结束 完毕 出口 0
注意:这显然只适用于 NVIDIA GPU
答案1
该策略实际上相当简单。
使用您可以创建一个名为(或任何您想要命名的)qconf -mc
的复杂资源。资源定义应如下所示:gpu
#name shortcut type relop requestable consumable default urgency
#----------------------------------------------------------------------------------------------
gpu gpu INT <= YES YES 0 0
然后,您应该编辑执行主机定义,以qconf -me
设置执行主机上具有 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
现在您已经设置了执行主机,您可以在提交作业时请求 GPU 资源。例如:qsub -l gpu=1
GridEngine 将跟踪有多少个可用的 GPU。
如果每个使用 GPU 的节点运行多个作业,您可能需要将 GPU 置于独占模式。您可以使用实用程序执行此操作nvidia-smi
。
答案2
Open Grid Engine 在 2011.11 版本中增加了 GPU 负载传感器支持,无需 nvidia-smi。nvidia-smi 应用程序的输出可能会(并且确实会)在驱动程序版本之间发生变化,因此不建议使用其他方法。
如果您有 GE2011.11 源代码树,请查找:dist/gpu/gpu_sensor.c
编译负载传感器(需要系统上有 CUDA 工具包):
%cc gpu_传感器.c-lnvidia-ml
如果您只想以交互方式查看负载传感器报告的状态,请使用以下命令进行编译:
独立式
要在 Grid Engine 集群中使用负载传感器,您只需遵循标准负载传感器设置程序:
资料来源:
答案3
当你有多个 GPU 并且希望你的作业请求一个 GPU,但 Grid Engine 调度程序应该处理并选择一个自由的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
在执行主机配置中,您可以使用 id/名称初始化您的资源(这里只是 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 参数。
您可以找到更多配置示例www.gridengine.eu。
请注意,所有这些功能仅在 Univa Grid Engine(8.1.0/8.1.3 及更高版本)中可用,而不在 SGE 6.2u5 和其他 Grid Engine 版本(如 OGE、Sun of Grid Engine 等)中可用。您可以从 univa.com 下载 48 核有限免费版本进行试用。
答案4
对于 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,而不会导致其他作业泄漏的问题。我仍然必须像上面一样为节点设置耗材。
这个解决方案不如其他解决方案好,但我发现 SGE 2011.11 中没有 RSMAP 选项。我希望最终获得这种配置,这样我就可以设置使用哪些 GPU。
希望这可以帮助某些人节省几个小时的配置时间。