4

我们有一个机器集群,每台机器有 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,或任何)。

gpu0, gpu1, gpu2, gpu3-l想创建 4 个资源(有任何想法吗?

4

2 回答 2

4

当您有多个 GPU 并且您希望您的作业请求 GPU 但 Grid Engine 调度程序应处理并选择空闲GPU 时,您可以配置 RSMAP(资源映射)复合体(而不是 INT)。这允许您在主机配置中指定特定主机上的 GPU 数量和名称。您还可以将其设置为主机消耗品,以便独立于您请求的插槽,使用 -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 附近(靠近 PCIe 总线)的一些 CPU 内核,以加快 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 核有限免费版本来试用它。

于 2013-02-05T07:15:48.253 回答
1

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

于 2013-10-16T15:00:03.737 回答