首页 > 解决方案 > Bash 中用于并行运行进程的资源管理

问题描述

我们在没有资源管理器的情况下与多个 GPU 节点共享服务器。我们约定:“本周您可以使用节点 ID1、ID2 和 ID5”。我有一个程序可以将此 ID 作为参数。

当我需要使用十组不同的参数运行我的程序十次时$ARGS1, $ARGS2, ..., $ARGS10,我运行前三个命令

programOnGPU $ARGS1 -p ID1 &
programOnGPU $ARGS2 -p ID2 &
programOnGPU $ARGS3 -p ID5 &

然后我必须等待其中任何一个完成,如果 ID2 先完成,然后我运行

programOnGPU $ARGS4 -p ID2 &

因为当您有很多流程时这不是很方便,所以我想自动化流程。我不能使用parallel,因为我需要重用 ID。

第一个用例是一个脚本,它需要执行先验已知的 10 个类型的命令

programOnGPU $PARAMS -p IDX

当他们中的任何一个完成将其 ID 分配给队列中的另一个时。这是否可以在没有过多 SLURM 类型开销的情况下使用 bash?我不需要检查物理资源的状态。

一般的解决方案是,如果我可以在 bash 或简单的命令行实用程序中创建一个队列,我将向其提交类型的命令

programABC $PARAMS

它将向其中添加 GPU ID 参数并管理将被预配置为能够同时使用给定 ID 和一个 ID 的队列。同样,我不希望这一层接触物理 GPU,而是要确保它在允许的 ID 上始终如一地执行。

标签: bashparallel-processing

解决方案


这对于Redis来说非常简单。它是一个非常小、非常快、联网的内存数据结构服务器。它可以存储集合、队列、哈希、字符串、列表、原子整数等。

您可以通过实验室中的网络或世界各地的网络访问它。有bashC/C++RubyPHPPython等客户端。

因此,如果您在一周内分配了节点 1、2 和 5,您可以使用Redis “命令行界面” * for bash将它们存储在带有LPUSH的 Redis “列表”中:

redis-cli lpush VojtaKsNodes 1 2 5

如果您不在Redis主机上,请将其主机名/IP 地址添加到命令中,如下所示:

redis-cli -h 192.168.0.4 lpush VojtaKsNodes 1 2 5

现在,当您想要运行作业时,请使用BRPOP获取节点。我指定了一个无限超时,最后为零,但您可以等待不同的时间:

# Get a node with infinite timeout
node=$(redis-cli brpop VojtaKsNodes 0)

run job on "$node"

# Give node back
redis-cli lpush VojtaKsNodes "$node"

推荐阅读