mcpField
J
jobd

jobd

本地服务
github.com云与基础设施52 天前更新

关于 jobd

jobd 是面向自有多台机器的作业队列与调度器,适合管理 GPU 和其他计算任务的开发者。它依据实时 VRAM、RAM、CPU 等容量分配任务,并提供 MCP 接口供 Agent 管理作业。

主要功能

  1. 01按实时 VRAM 与主机能力路由
  2. 02跨机器排队和持久化作业
  3. 03优先级抢占及检查点宽限期
  4. 04查看状态、日志并取消作业
  5. 05支持作业数组与批量任务

适用场景

  1. 01将训练任务分配到有足够空闲显存的主机
  2. 02关闭终端后继续运行并查看作业
  3. 03由 Agent 通过 MCP 提交和监控作业

MCP 相关

jobd-mcp 将作业队列功能提供为九种工具,供 MCP 客户端提交、查看、取消及管理作业和 Worker。

配置

本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。

mcp.json · 通用配置
{
"mcpServers": {
"musharna-jobd": {
"command": "uvx",
"args": [
"jobd"
],
"env": {
"JOBD_URL": "<JOBD_URL>",
"JOBD_API_TOKEN": "<JOBD_API_TOKEN>"
}
}
}
}
启动命令uvx jobd
需要配置的环境变量
JOBD_URLBase URL of the jobd broker the MCP server talks to. Defaults to http://127.0.0.1:8765.
JOBD_API_TOKEN密钥Bearer token; must match the broker's JOBD_API_TOKEN. Required unless the broker runs with JOBD_ALLOW_NO_AUTH=1.

本地服务需要在你的电脑上安装运行环境(如 Node.js 18+)。各客户端的配置文件位置不同,请参考客户端文档。

安装包
pypijobd0.5.52

工具

还没有获取到工具列表

本地服务需要在你的电脑上运行后才能读取工具,维护者暂未提供工具列表。

详细介绍

jobd

jobd 是一个任务代理,并提供 MCP 服务,让 AI Agent 能在你自己的几台机器上提交、路由和照看任务。类似 task-spooler 或 pueue,但可在你通过 Tailscale 或局域网连接的所有机器之间运行,并将每项任务路由到有足够空闲 VRAM 的工作节点,不需要云服务、Kubernetes 或 Slurm。

CI PyPI Python License DOI Glama

jobd 运行示例:任务集群状态显示四个工作节点及其版本;GPU 任务被路由到有足够空闲 VRAM 的工作节点并流式返回;通过 stdin 批量一次提交两个任务;job logs -f 跟踪一个任务直至完成

# from any machine on your tailnet:
job submit --project myproj --gpu --vram-required 16 --wait -- python train.py
# → routed to whichever worker has ≥16 GB VRAM free, streamed back to your terminal

VRAM 路由每台主机只跟踪一块 GPU:工作节点仅报告 GPU 索引 0 上的空闲显存。

为什么要开发它

  • 按 VRAM 适配路由。 每项任务都会分配给实时空闲 VRAM、RAM、CPU、能力标签以及架构/操作系统均符合要求的工作节点,不必再猜哪台机器有空。
  • 带检查点窗口的抢占。 优先级更高的任务可以抢占正在运行的任务:发送 SIGTERM,为工作负载留出宽限时间,将状态保存到其 JOBD_CHECKPOINT_DIR,然后发送 SIGKILL。被抢占的任务不会重新运行;要恢复任务,请提交一个指向检查点的新任务(docs/preemption.md)。
  • 会话结束后依然运行。 任务保存在代理中,而非你的 shell 里。提交任务,合上笔记本,明天再来查看。
  • 原生支持 Agent。 MCP 服务可让 AI Agent 通过工具调用提交、监控和照看任务(基准测试展示的内容)。
  • 由你掌控。 在你自己的机器上运行一个代理进程。不需要账号,不收集遥测数据,也不按 GPU 小时计费。只有可选的自更新脚本会联网(运行手册)。

为什么不直接用……?

工具提供的功能为什么选择 jobd
nohup / tmux / ssh在一台机器上运行命令没有队列、VRAM 感知路由、抢占功能,也不会记录任务在哪台机器上运行
task-spooler单机任务队列jobd 可跨所有机器排队,并根据实时 VRAM/CPU 适配情况进行路由
Pueue成熟的单机队列守护进程Pueue 的 README 将分布式执行列为范围之外;jobd 提供这一层,并支持 GPU 感知
HyperQueue源自 HPC 的多机调度,采用单一二进制文件会统计 GPU 数量,但不跟踪 VRAM;没有抢占/检查点约定或 Agent 接口
Slurm数据中心级调度对于 2–3 台个人机器来说,搭建和运维负担太重
SkyPilot / dstack在云端和自有机器上运行SkyPilot 的“现有机器”模式会在你的机器上安装 Kubernetes(k3s);dstack 要求每台主机都安装 Docker 并配置免密 sudo
Modal无服务器 GPU 计算在 Modal 的机器上运行,而不是在你的机器上
Ray分布式计算;Ray Jobs 可在 Ray 集群上运行任意 shell 命令你得先搭建并运行 Ray 集群

安装

pip install jobd               # broker + CLI
pip install "jobd[mcp]"        # adds the MCP server
pip install "jobd[worker]"     # adds the worker daemon (jobd-worker)

需要 Python ≥ 3.11。scripts/install-worker.sh 会在 ~/jobd-worker 下配置一个工作节点,其中包含独立的 venv 和生成的配置文件。

快速入门(单主机)

# 1. start the broker (binds 127.0.0.1:8765 by default)
JOBD_ALLOW_NO_AUTH=1 jobd          # no-auth is fine for a loopback-only broker

# 2. in another shell, install + start a worker pointed at it
pip install "jobd[worker]"
JOBD_URL=http://127.0.0.1:8765 JOBD_WORKER_HOST=local jobd-worker

# 3. submit a job and wait for it
job submit --project demo --wait -- echo hello
job list
job logs <id>

如需多主机部署(Docker broker、systemd 工作节点、Tailscale 绑定、共享身份验证令牌),请参阅 docs/security.md 以及 docker-compose.yml 和 scripts/ 中的模板。向运行中的集群添加工作节点只需执行一条命令:

job fleet add user@newbox      # ssh in, install pinned to the broker's version,
                               # wire systemd units + the self-update timer,
                               # verify it registers. `job fleet status` shows drift.

日常运维(健康检查、排空工作节点、升级、令牌轮换、备份)请参阅 docs/runbook.md。

工作原理

架构:job CLI、jobd-mcp MCP 工具和 HTTP/SSE 客户端通过同一 tailnet 与 jobd broker(FastAPI — 队列、VRAM 匹配器、优先级、SQLite)通信;broker 通过长轮询认领和心跳将任务派发给工作节点 A(24 GB GPU)、B(8 GB GPU)和 C(仅 CPU)

broker(FastAPI + SQLite)负责维护队列、运行匹配器并解析各项目的优先级。每台主机上运行一个工作节点,它们会轮询 broker,因此不会有任何连接主动进入工作节点:每个工作节点都会报告实时容量、认领可运行的任务、回传日志并遵循抢占规则。提交的 argv 会原样运行(shell=False);job submit --stdin 和 MCP jobd_submit 工具是例外,它们会将命令字符串作为 bash -c <string> 运行。设计说明:docs/ARCHITECTURE.md。

CLI

job submit -p PROJ [options] -- CMD...       # queue a job
job list [--state STATE] [--project P]       # queue + recent jobs
job status ID | A<id> [--watch]              # one job, or an array's aggregate
job logs ID [-n BYTES]                       # tail captured output
job wait ID                                  # block until terminal
job cancel ID  /  job preempt ID             # stop a job
job adopt --pid N -p PROJ [--gpu]            # track a process started outside jobd (Linux)
job workers                                  # fleet snapshot + health
job projects list | set NAME PRI | nudge NAME DELTA
job audit [--project P] [--since 24h]        # event history

任务数组和扫描、--explain 试运行、job adopt,以及 pueue/task-spooler 命令对照表:docs/cli.md。

MCP / Agent 集成

jobd-mcp 将队列公开为九个工具:jobd_submit、jobd_status、jobd_logs、jobd_list、jobd_cancel、jobd_preempt、jobd_events、jobd_workers、jobd_worker_delete。docs/agent-cookbook.md 介绍如何监控任务、执行抢占、进行扫描,以及询问任务无法调度的原因。

适用于 Claude Code:

claude mcp add jobd \
  --env JOBD_URL=http://127.0.0.1:8765 \
  --env JOBD_API_TOKEN=<your-token> \
  -- jobd-mcp

其他 MCP 客户端:

{
  "mcpServers": {
    "jobd": {
      "command": "jobd-mcp",
      "env": {
        "JOBD_URL": "http://127.0.0.1:8765",
        "JOBD_API_TOKEN": "<your-token>"
      }
    }
  }
}

JOBD_API_TOKEN 必须与 broker 的令牌一致,否则每次调用都会返回 401。examples/claude-code-hooks/ 提供可选钩子,可提示(或强制阻止)Agent 通过 jobd 提交重型命令。

基准测试结果

我们用 Claude 对 38 个关于实时 broker 的问题进行了比较:一次使用该服务,一次使用 jobd 自带的 job CLI,每种设置各运行 3 次。使用 Claude Haiku 5.5 时,该服务每次运行都答对全部 38 题,而 CLI 答对 29 题:这是预注册的胜出结果(Holm 校正后的 McNemar p = 0.008)。使用 Sonnet 5.5 时,结果为 36 比 30;使用 Opus 5.5 时,结果为 38 比 37,差异都不显著。对于这三种模型,该服务的答案成本更低、速度更快;使用 Sonnet 时,成本为 0.20 倍,耗时为 0.17 倍。

关于实时 jobd broker 的 38 个问题的答对和答错数量柱状图;每种 Claude 设置对每题运行 3 次。没有模型的恒定猜测:答对 3 题,答错 35 题。与答案键最匹配的恒定猜测:答对 9 题,答错 29 题。使用 job CLI 的 Claude:答对 113 题,答错 1 题。使用 jobd-mcp 的 Claude:114 题全部答对。

图表显示的是 Opus 5.5 的运行结果(2026-10-18)。该运行中,该服务的答案成本中位数为 0.20 倍(95% CI 为 0.15 至 0.28),耗时为 0.16 倍(0.13 至 0.20),并且在全部 38 道题上都更便宜、更快。这些是次要终点,测量时使用了一个尚未发布的提交,该提交为 jobd_list 添加了 finished_at 时间窗口。在更早、难度更低的一组测试中,两种设置都答对了 123 题中的 123 题。

问题由我们编写,基准测试也由我们执行;欢迎外部复测。方法、控制措施和局限性:benchmarks/agent_qa;Haiku 和 Sonnet 的运行结果:2026-10-20 复测。

支持的平台

组件LinuxmacOSWindows
Broker(jobd)已测试预期支持预期支持(推荐使用 WSL)
CLI(job)/ MCP(jobd-mcp)已测试预期支持预期支持
Worker(jobd-worker)已测试功能受限未测试

CI 在没有 GPU runner 的 Ubuntu 上运行(VRAM 路径通过 mock 测试);如果没有 systemd 用户实例,worker 仍会运行作业,但会失去内存上限、进程回收和抢占保证。

配置

安全

将 broker 运行在 loopback 或 Tailscale tailnet 上,切勿绑定到公共接口。共有三层控制:

  1. 绑定地址:JOBD_HOST 默认值为 127.0.0.1;将其设为 Tailscale 地址(100.64.0.0/10),切勿设为 0.0.0.0。broker 不会强制执行此限制。
  2. **源 IP:**来自 loopback 和 100.64.0.0/10 以外的请求会收到 403(设置 JOBD_DISABLE_TAILNET_ACL=1 可关闭此功能)。
  3. **令牌:**每台主机都必须设置 JOBD_API_TOKEN;JOBD_ALLOW_NO_AUTH=1 仅适用于只绑定 loopback 的 broker,绑定到其他地址时会向你的 tailnet 暴露未经身份验证的代码执行能力。

/livez、/readyz 和 /metrics 不受源 IP 检查和令牌验证限制;/metrics 会显示每个 worker 的主机名和版本,因此不要对 broker 进行端口转发。威胁模型和令牌轮换:docs/security.md。

License

MIT; see LICENSE.

评论

支持 Markdown

第一次接触 MCP?

从协议是什么,到在客户端里装上第一个服务,这几条回答覆盖了大多数入门问题。

一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。