在 PBS 上并行化进化算法

计算科学 PBS
2021-12-07 18:45:42

我已获准访问运行 PBS 的集群,我想在其上运行进化算法 (EA)

对于那些不熟悉 EA 的人,维基百科将其总结为:

第一部分:随机生成初始个体群体(第一代)。

第二部分:重复以下步骤直到终止:

  1. 评估群体中每个个体的适应度
  2. 选择最适合繁殖的个体(父母)
  3. 通过交叉和变异操作繁殖新个体以产生后代。
  4. 用新个体替换人口中最不适合的个体。

评估个人的健康状况可能需要长达 1 小时,并且在具有专用硬件 (Xeon Phi) 的节点上运行。其他一切都相对便宜(可以在单个 CPU 上不到 60 秒的时间内执行)。

我打算做的是:

在我自己的计算机上生成初始种群并将其上传到集群,然后启动一个作业“ea_loop”

  1. 启动 N 个工作,其中 N = 人口中个体的数量,以评估个体的适应度。
  2. 每 60 秒检查一次是否所有作业都已完成。
  3. 完成所有作业后,执行 EA 第二部分的步骤 2、3 和 4。
  4. 检查是否满足终止条件,如果不满足则转到 1。

我的主要问题是:似乎我无法启动子作业,当我尝试启动它们时收到以下错误消息。

qsub:作业执行的错误 UID

我对此进行了谷歌搜索,但几乎所有点击都与工作依赖性有关,我认为这不是一个适当的解决方案。最简单的方法是在头节点中运行“ea_loop”,但是头节点上的计算是不受欢迎的(并且可能是不允许的)。我该怎么办?

我的次要问题与我计划的解决方案的不雅有关。每 60 秒检查一次作业是否完成有点臭;有没有办法使用某种回调?

3个回答

您为此类操作使用了错误的工具。PBS 调度单个作业,但它旨在处理“运行优化算法”类型的作业,而不是“运行一个函数评估”。

我对实现这种算法的建议是建立在 MPI 之上并将其编写为主从 [1] 算法,其中从属执行功能评估,而主控协调整体编排。这对于 P2P 通信来说并不太复杂。

[1] 我已经不太喜欢“主从”这个说法了,但还没有找到合适的替代词,让每个人都能理解。人们在用什么?

我认为你试图做的是完全合理的。我认为在头节点上运行ea_loop脚本没有任何问题,前提是它主要执行控制级别的操作,例如提交作业和检查完成等。

您能否将大约 60 秒的 EA 操作封装到通过 PBS 提交的小作业中,而不是尝试直接在头节点上进行这些计算?

其他一些评论:

  • 在大多数 PBS 实现中,默认情况下禁用从计算节点提交作业,但管理员可以轻松启用。它可能是故意禁用的,但如果它是由您的研究小组维护的一个小集群或其他东西,这很容易解决。
  • 取决于多大N也就是说,出于礼貌,您可能希望将每一代分成几个部分,这样您就不会挤满队列。虽然资源管理器/调度器应该能够处理大量排队的作业,但根据我的经验,当有人一次用 100 多个作业淹没队列时,这非常令人沮丧。(我也是那个挤满队列并从同龄人那里得到恼火的人:))
  • 像你一样定期检查工作完成情况我没有问题。我认为如果你想做一些更有趣的事情,你应该去看看@WolfgangBangerth 提出的完整的 MPI 解决方案。

虽然不能直接回答您的问题,但您是否考虑过使用像Pagmo这样为您管理并行化的库?大概,那么您只需要从集群上的调度程序请求一定数量的资源。