Bash中用于并行运行进程的资源管理

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

我们使用多个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 &
由于这是不是很方便,当你有很多过程,我想自动化的过程。我不能使用
并行
,因为我需要重用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非常简单。它是一个非常小、非常快、网络化的内存数据结构服务器。它可以存储集合、队列、散列、字符串、列表、原子整数等

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

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

    redis-cli lpush VojtaKsNodes 1 2 5
    
    如果您不在Redis主机上,请将其主机名/IP地址添加到命令中,如下所示:

    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是免费的,并将其传递给另一个进程。为什么您认为不能使用
    parallel
    ?只需使其在IDx阵列上并行并从共享输入读取即可。正如tripleee提到的,如果您已安装了
    parallel
    ,请查看使用
    -j#
    选项来限制并发作业的数量;如果您没有(或无法)安装
    parallel
    ,您可以使用
    while
    循环并行启动'N'个作业,然后使用
    wait-N
    等待一个作业完成,然后在后台启动下一个作业(例如,);如果您的
    bash
    不支持
    wait-n
    ,您可以将其视为一种加载方式balancing@VojtaK哇,太酷了,那么就这么做吧——编写这样一个系统,以所需的方式管理资源。你为什么在这里写信?你有什么问题?如果您的问题是
    是否可以使用bash
    -那么是的,当然可以。想做就做™ - 学习bash,学习工具、管理和锁定,并编写这样一个实用程序。如果你想让别人为你写这样一个实用程序,我建议你建立一个自由职业者网站。谢谢!此解决方案非常通用,因此我们决定将其用于管理多个用户的资源。但仍存在一些缺点,例如brpop按呼叫时间进行优先级排序,因此无法克服挂起呼叫的优先级。第二,对于“普通用户”,它的开销相当大,因此我最终会基于此为giveMeGPU和returnGPU编写脚本。我还找到了一种方法,通过哈希将用户名与他关联的GPU关联起来。很酷-很高兴你开始使用它。如果你已经制定了一个更好、更完整的解决方案,请随意写下来作为答案并接受它——我一点也不担心失去分数。谢谢你的回答。我认为我所问的问题相当笼统,所以我希望有一个工具可以解决这个问题。我正在寻找如何做到这一点的方法,如果用户愿意或不愿意分享他们的答案,这取决于他们。