如何为 CUDA 设备设置 SGE?

如何为 CUDA 设备设置 SGE?

我目前面临的问题是将 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=1GridEngine 将跟踪有多少个可用的 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 集群中使用负载传感器,您只需遵循标准负载传感器设置程序:

http://gridscheduler.sourceforge.net/howto/loadsensor.html

资料来源:

  1. http://marc.info/?l=npaci-rocks-discussion&m=132872224919575&w=2

答案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。

希望这可以帮助某些人节省几个小时的配置时间。

相关内容