bash - 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 上始终如一地执行。
解决方案
这对于Redis来说非常简单。它是一个非常小、非常快、联网的内存数据结构服务器。它可以存储集合、队列、哈希、字符串、列表、原子整数等。
您可以通过实验室中的网络或世界各地的网络访问它。有bash、C/C++、Ruby、PHP、Python等客户端。
因此,如果您在一周内分配了节点 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"
推荐阅读
- java - 如何以编程方式重命名 .Java 文件中的字段、参数、类名和方法名?
- angular - 是否可以显示选择初始值的角度材料的多选组件?
- javascript - 如何过滤获取的 JSON 数据?
- html - ValueError:通过了 60 列,传递的数据有 282 列
- python - 处理对象方法的Python3多处理池未获取对象的更新数据
- node.js - Node JS - Big Query 将请求对象完全插入到记录数据类型中
- python - 如何映射 pandas._libs.missing.NAType 类型的 NA 值
- python - 尝试创建“析构函数”时,弱引用对象不再存在
- sql-server - 按过去 5 年过滤的 SQL 语句
- python - 从各种 PDF 文件中抓取表格