Bash中用于并行运行进程的资源管理
我们使用多个GPU节点共享服务器,而不使用资源管理器。我们达成的协议是:“本周您可以使用节点ID1、ID2和ID5”。我有一个程序把这个ID作为参数 当我需要使用十组不同的参数运行我的程序十次时,Bash中用于并行运行进程的资源管理,bash,parallel-processing,Bash,Parallel Processing,我们使用多个GPU节点共享服务器,而不使用资源管理器。我们达成的协议是:“本周您可以使用节点ID1、ID2和ID5”。我有一个程序把这个ID作为参数 当我需要使用十组不同的参数运行我的程序十次时,$ARGS1、$ARGS2、$ARGS10,我运行前三个命令 programOnGPU $ARGS1 -p ID1 & programOnGPU $ARGS2 -p ID2 & programOnGPU $ARGS3 -p ID5 & 然后我必须等待其中任何一个完成,如果ID2
$ARGS1、$ARGS2、$ARGS10
,我运行前三个命令
programOnGPU $ARGS1 -p ID1 &
programOnGPU $ARGS2 -p ID2 &
programOnGPU $ARGS3 -p ID5 &
然后我必须等待其中任何一个完成,如果ID2先完成,我就运行
programOnGPU $ARGS4 -p ID2 &
由于这是不是很方便,当你有很多过程,我想自动化的过程。我不能使用并行
,因为我需要重用ID
第一个用例是需要执行apriori已知的10个命令类型的脚本
programOnGPU $PARAMS -p IDX
programABC $PARAMS
当它们中的任何一个完成时,将其ID分配给队列中的另一个。使用bash时是否可以避免过多的SLURM类型的开销?我不需要检查物理资源的状态
一般的解决方案是,如果我可以在bash或简单的命令行实用程序中创建一个队列,我将向其中提交以下类型的命令
programOnGPU $PARAMS -p IDX
programABC $PARAMS
它将向其中添加GPU ID参数,并管理队列,该队列将预配置为能够同时使用给定ID和一个ID。同样,我不希望该层接触物理GPU,但为了确保它在允许的ID上一致地执行。我会:
- 我有一个
IDS=(id1id2id5)
- 我会制作3个文件,每个文件有一个ID
- 运行
这对于Redis非常简单。它是一个非常小、非常快、网络化的内存数据结构服务器。它可以存储集合、队列、散列、字符串、列表、原子整数等 您可以通过实验室的网络或世界各地访问它。有用于bash、C/C++、Ruby、PHP、Python等的客户端 因此,如果您被分配了一周的节点1、2和5,您可以使用Redis“命令行界面”*(用于bash)将它们存储在Redis“列表”中:
如果您不在Redis主机上,请将其主机名/IP地址添加到命令中,如下所示:redis-cli lpush VojtaKsNodes 1 2 5
现在,当您想要运行作业时,请使用获取一个节点。我指定了一个无限超时,结尾为零,但您可以等待不同的时间:redis-cli -h 192.168.0.4 lpush VojtaKsNodes 1 2 5
# Get a node with infinite timeout node=$(redis-cli brpop VojtaKsNodes 0) run job on "$node" # Give node back redis-cli lpush VojtaKsNodes "$node"
我不太了解您的示例/需求,但如果您想通过一种简单的方式在网络上的大量人员中保留/分配资源,您可以使用Redis制作一些开销非常低、可靠、快速且响应迅速的东西-请参阅和@MarkSetchell我已尝试改进这个问题。在我的例子中,问题是作业在执行之前需要知道自由ID。当给定ID的进程完成时,管理工具必须确定给定ID是免费的,并将其传递给另一个进程。为什么您认为不能使用
?只需使其在IDx阵列上并行并从共享输入读取即可。正如tripleee提到的,如果您已安装了parallel
,请查看使用parallel
选项来限制并发作业的数量;如果您没有(或无法)安装-j#
,您可以使用parallel
循环并行启动'N'个作业,然后使用while
等待一个作业完成,然后在后台启动下一个作业(例如,);如果您的wait-N
不支持bash
,您可以将其视为一种加载方式balancing@VojtaK哇,太酷了,那么就这么做吧——编写这样一个系统,以所需的方式管理资源。你为什么在这里写信?你有什么问题?如果您的问题是wait-n
-那么是的,当然可以。想做就做™ - 学习bash,学习工具、管理和锁定,并编写这样一个实用程序。如果你想让别人为你写这样一个实用程序,我建议你建立一个自由职业者网站。谢谢!此解决方案非常通用,因此我们决定将其用于管理多个用户的资源。但仍存在一些缺点,例如brpop按呼叫时间进行优先级排序,因此无法克服挂起呼叫的优先级。第二,对于“普通用户”,它的开销相当大,因此我最终会基于此为giveMeGPU和returnGPU编写脚本。我还找到了一种方法,通过哈希将用户名与他关联的GPU关联起来。很酷-很高兴你开始使用它。如果你已经制定了一个更好、更完整的解决方案,请随意写下来作为答案并接受它——我一点也不担心失去分数。谢谢你的回答。我认为我所问的问题相当笼统,所以我希望有一个工具可以解决这个问题。我正在寻找如何做到这一点的方法,如果用户愿意或不愿意分享他们的答案,这取决于他们。是否可以使用bash