#实验 #集群 #作业 #任务 #自动化 #任务 #测试

bin+lib expjobserver

这是一个跨多个测试平台的实验作业服务器和客户端。在某种程度上,它就像一个简单的集群管理器。

9 个版本 (5 个重大更改)

0.9.2 2020年12月16日
0.9.0 2020年10月17日
0.4.0 2020年7月2日

#273 in 科学

MIT/Apache

195KB
4K SLoC

expjobserver

这是一个跨多个测试机器的实验作业服务器和客户端。在某种程度上,它就像一个简单的集群管理器。

高级概念是,你有一个服务器(expjobserver),它在你的机器(例如始终在线的桌面机)上运行,可能在一个屏幕会话中。你有一些实验,你希望从某个驱动程序应用程序或脚本中运行。你还有一群机器,可能类型不同,你希望在这些机器上运行作业。 expjobserver 将这些作业调度到这些机器上,并将结果复制回主机机器(运行服务器的机器)。通过无状态的 CLI 客户端与服务器交互。

此外,expjobserver 还支持以下功能

  • 一个出色的 CLI 客户端,具有生成 shell 完成脚本的 capability。
  • 机器类别:相似机器被添加到同一类别,作业被调度在类别中的任何机器上运行。
  • 机器设置:expjobserver 可以运行一系列设置机器,并在完成时自动将机器添加到其类别中。
  • 作业矩阵:使用不同参数组合运行作业。
  • 只要实验驱动程序向 stdout 输出格式为 RESULTS: <OUTPUT FILENAME> 的行,就会自动将结果复制回主机。
  • 良好的服务器日志记录。
  • 通过使用 protobuf 保存服务器历史记录并与客户端通信,尝试对失败、崩溃和服务器/客户端版本不匹配具有一定的容错能力。

先决条件

  • rust1.37+

安装

cargo install expjobserver

这将安装客户端(j)和服务器(expjobserver)。

构建

这些命令都会构建客户端和服务器

# Debug
cargo build

# Release
cargo build --release

实际上,这并不重要,因为我已经禁用了优化并为发布构建添加了调试信息。原因是性能在这里并不重要(服务器本身也不是性能优化的),而可调试性非常有帮助。

用法

运行服务器

expjobserver \
  /path/to/experiment/driver \
  /path/to/logs/ \
  /path/to/log4rs/config.yaml

第一次运行时,您需要传递 --allow_snap_fail 标志,这将允许覆盖服务器历史记录。默认情况下,如果加载历史记录失败,则会失败并退出。这是为了提供一点安全性,以防您在奇怪的配置下重新启动,不会清除服务器的历史记录,这可能会很烦人。

您可能想在一个 screentmux 会话中运行服务器。这样,您可以断开连接并在后台运行。您始终可以通过再次连接或通过命令查看 /path/to/logs 来检查日志,其中服务器将记录调试日志。

服务器使用 log4rs 库进行日志记录。它是高度可配置的。这是我自己使用的合理配置 example.log.yml。要使用它,使用命令中的第二个参数将服务器指向它。

运行客户端

j --help

有许多子命令。它们在 CLI 使用消息中有很好的文档。

示例

这主要是为了快速浏览您能做什么(针对客户端)。这不是全面的。阅读使用消息(--help)以获取有关您能做什么的所有信息的更多信息。有很多酷炫的功能!

将机器添加到池中

首先,让我们列出池中的机器。

$ j machine ls


目前,没有。让我们添加一些。如果我们已经设置了机器,我们可以使用 j machine add,但我们也可以让机器运行设置脚本,并在之后自动添加到池中。

$ j machine setup --class foo -m my.machine.foo.com:22 -- "setup-the-thing {MACHINE} --flag --blah" "another-setup-command"
Server response: Jiresp(
    JobIdResp {
        jid: 0,
    },
)

在这里,{MACHINE} 将自动替换为 my.machine.foo.com:22。您也可以使用其他变量(请参阅 j var 命令)。这可以在几种方式上有所帮助

  • {MACHINE} 允许您为多台机器使用相同的命令(您可以通过传递 -m 多次)。
  • 您可以使用其他变量来最小化最终出现在您的 bash 历史记录中的机密数量(例如,如果您需要 GitHub 访问令牌或类似的东西)。

在此阶段,机器 my.machine.foo.com:22 将按照给定顺序开始运行列出的命令。假设它们都成功,该机器将被添加到池中的 foo 类别,并准备好运行任何请求 foo 类别机器的工作。

列出和排队作业

上述服务器响应中的 jid: 0 是设置任务的作业 ID。我们可以看到当前正在运行的任务,包括设置任务。

$ j job ls
 Job   Status  Class  Command                                  Machine                Output
   0  Running  foo    setup-the-thing {MACHINE} --flag --blah  my.machine.foo.com:22

目前,迄今为止唯一运行的是我们上面启动的设置任务。

我们可以为 foo 类别机器排队一些其他作业,以便在准备好时运行。

$ j job add foo "bar --the --foo baz" /path/to/results/dir -x 3
Server response: Jiresp(
    JobIdResp {
        jid: 1,
    },
)
Server response: Jiresp(
    JobIdResp {
        jid: 2,
    },
)
Server response: Jiresp(
    JobIdResp {
        jid: 3,
    },
)

这里我们将 3 个相同的任务排队,以便在第一个可用的 foo 机器上运行。作业按排队顺序运行。

$ j job ls
 Job   Status  Class  Command                                  Machine                Output
   0     Done  foo    setup-the-thing {MACHINE} --flag --blah  my.machine.foo.com:22
   1  Running  foo    bar --the --foo baz                      my.machine.foo.com:22
   2  Waiting  foo    bar --the --foo baz
   3  Waiting  foo    bar --the --foo baz

我们可以查看作业的 stdout(使用 tail

j job log -t 1

其中 1 是上面表格中运行任务的作业ID。您还可以查看已完成任务的日志或获取日志文件的路径。

$ j job log -l 0                # look at the log of 0 with `less`
...

$ j job log 0                   # path to the log file
/some/path/0-setup-the-thing_my.machine.foo.com:22_--flag_--blah

作业矩阵

有时您想运行一系列略有变化的相似命令(例如,为了查看改变一个参数的效果)。

您可以使用 j job matrix 来实现。

j job matrix add foo "my-experiment-cmd --param0 {I} --param1 {J} --param2 {K}" \
    /path/to/copy/results/ I=1,2,3,4 J=linear,quadratic,exotic K=banana,rockingchair,airplane

该命令将排队 4x3x3 = 36 个作业,您可以通过 j job lsj job matrix stat 来查看。

此外,您还可以使用 j job matrix csv 将矩阵和任何结果路径导出为 CSV 格式。

更多

查看各个命令和子命令的 --help 帮助信息,以了解更多功能。

依赖关系

~6.5–10MB
~156K SLoC