| name | bohrium-job |
| description | Manage Bohrium compute jobs via bohr CLI or open.bohrium.com API. Use when: user asks about submitting/listing/killing/deleting compute jobs on Bohrium, checking job logs, or monitoring job status. NOT for: node management, image management, or project management. |
SKILL: Bohrium 任务 (Job) 管理
概述
管理 Bohrium 平台的计算任务。优先使用 bohr CLI,仅在 CLI 不支持的高级操作时回退到 API。
认证配置
BOHR_ACCESS_KEY 和 PROJECT_ID 从 OpenClaw 配置文件 ~/.openclaw/openclaw.json 中读取:
"bohrium-job": {
"enabled": true,
"apiKey": "YOUR_BOHR_ACCESS_KEY",
"env": {
"BOHR_ACCESS_KEY": "YOUR_BOHR_ACCESS_KEY",
"PROJECT_ID": "YOUR_PROJECT_ID"
}
}
OpenClaw 会自动将 env 中的变量注入到运行环境。Skill 只要求配置 BOHR_ACCESS_KEY;兼容旧 CLI 所需的映射由辅助脚本内部处理。
直接调用 bohr CLI 时,先把 BOHR_ACCESS_KEY 映射给旧 CLI 读取的 ACCESS_KEY:
export ACCESS_KEY="$BOHR_ACCESS_KEY"
前置条件:安装 bohr CLI
/bin/bash -c "$(curl -fsSL https://dp-public.oss-cn-beijing.aliyuncs.com/bohrctl/1.0.0/install_bohr_mac_curl.sh)"
/bin/bash -c "$(curl -fsSL https://dp-public.oss-cn-beijing.aliyuncs.com/bohrctl/1.0.0/install_bohr_linux_curl.sh)"
source ~/.bashrc
export PATH="$HOME/.bohrium:$PATH"
export ACCESS_KEY="$BOHR_ACCESS_KEY"
bohr version
安装脚本会自动配置 OPENAPI_HOST 和 TIEFBLUE_HOST 环境变量。若未生效,手动设置:
export OPENAPI_HOST=https://open.bohrium.com
export TIEFBLUE_HOST=https://tiefblue.dp.tech
提交任务
方式 1:命令行参数(推荐)
bohr job submit \
-m "registry.dp.tech/dptech/deepmd-kit:3.1.1" \
-t "c4_m15_1 * NVIDIA T4" \
-c "python train.py" \
-p ./input_dir/ \
--project_id YOUR_PROJECT_ID \
-n "my-job-name"
参数说明:
| 参数 | 缩写 | 必填 | 说明 |
|---|
--image_address | -m | 是 | 镜像地址(必须用完整地址,如 registry.dp.tech/dptech/xxx:tag) |
--machine_type | -t | 是 | 机器规格 |
--command | -c | 是 | 执行命令 |
--input_directory | -p | 否 | 输入文件目录(默认 ./) |
--project_id | | 是 | 项目 ID |
--job_name | -n | 否 | 任务名称 |
--log_file | -l | 否 | 日志文件路径 |
--result_path | -r | 否 | 完成后自动下载结果到指定目录(仅 /data、/personal、/share) |
--job_group_id | -g | 否 | 任务组 ID(需先通过 bohr job_group create 创建) |
--max_run_time | | 否 | 最大运行时间(分钟),超时自动终止并回收文件 |
--max_reschedule_times | | 否 | 异常中断后自动重试次数 |
--nnode | | 否 | 并行计算节点数(默认 1) |
方式 2:配置文件(适合复杂场景)
bohr job submit -i job.json -p ./input_dir/
job.json 完整示例:
{
"job_name": "my-training-job",
"command": "python train.py --epochs 10",
"log_file": "train.log",
"backward_files": ["model.pt", "results/"],
"project_id": YOUR_PROJECT_ID,
"machine_type": "c4_m15_1 * NVIDIA T4",
"image_address": "registry.dp.tech/dptech/deepmd-kit:3.1.1",
"job_type": "container",
"disk_size": 50,
"dataset_path": ["/bohr/my-dataset/v1"],
"result_path": "/personal",
"max_reschedule_times": 2,
"max_run_time": 120,
"nnode": 1
}
job.json 字段说明:
| 字段 | 说明 | 示例 |
|---|
job_name | 任务名称 | "DeePMD-kit test" |
command | 执行命令,用相对路径 | "cd se_e2_a && dp train input.json" |
log_file | 运行期间可实时查看的日志文件 | "train.log" |
backward_files | 需要下载的结果文件,为空则保留全部 | ["model.pt", "results/"] |
project_id | 项目 ID | YOUR_PROJECT_ID |
machine_type | 机器规格 | "c4_m15_1 * NVIDIA T4" |
image_address | 完整镜像地址(非镜像名) | "registry.dp.tech/dptech/deepmd-kit:2.1.5-cuda11.6" |
job_type | 必须为 "container" | "container" |
dataset_path | 挂载的数据集路径数组 | ["/bohr/my-dataset/v1"] |
result_path | 自动回收结果到数据盘 | "/personal" |
max_run_time | 最大运行时间(分钟) | 120 |
max_reschedule_times | 异常中断重试次数 | 2 |
disk_size | 磁盘大小(GB) | 50 |
关键注意事项
| 项目 | 说明 |
|---|
| 工作目录 | Bohrium 自动 cd 到解压后的输入目录,cmd 中用相对路径 |
不要 cd /root/input | 实际路径是 /home/input_lbg-{userId}-{jobId}/,不可预测 |
| image_address 格式 | 必须用完整地址 registry.dp.tech/dptech/xxx:tag,不能只写镜像名 |
| machine_type 格式 | CPU: c2_m4_cpu;GPU: c4_m15_1 * NVIDIA T4、c8_m32_1 * NVIDIA V100 |
| WAF 拦截 | 若 command 含 shell 关键字被阿里云 WAF 拦截(405),将命令写入脚本,cmd 改为 bash run.sh |
| -p 参数大文件 | 提交后无输出提示时,检查 -p 目录下是否有大的隐藏文件导致压缩慢 |
| 自动重试 | 设置 max_reschedule_times 可在异常中断后自动重试(全量重跑) |
| job_type | 必须设为 "container",自 2023 年起不再支持虚拟机任务 |
查看任务
bohr job list -n 10
bohr job list -n 5 --json
bohr job list -r
bohr job list -f
bohr job list -i
bohr job list -p
bohr job list -j YOUR_JOB_GROUP_ID
查看任务详情
bohr job describe -j YOUR_JOB_ID --json
bohr job describe -j YOUR_JOB_ID -l
查看/下载日志
bohr job log -j YOUR_JOB_ID
bohr job log -j YOUR_JOB_ID -o ./logs/
下载任务结果
bohr job download -j YOUR_JOB_ID -o ./results/
bohr job_group download -j YOUR_JOB_GROUP_ID -o ./results/
管理任务
bohr job terminate YOUR_JOB_ID
bohr job kill YOUR_JOB_ID
bohr job delete YOUR_JOB_ID
bohr job terminate YOUR_JOB_ID YOUR_JOB_ID_2
bohr job delete YOUR_JOB_ID YOUR_JOB_ID_2
terminate vs kill vs delete:
| 操作 | 结果文件 | 任务记录 | 状态 |
|---|
terminate | 保留 | 保留 | → completed |
kill | 不保留 | 保留 | → failed |
delete | 删除 | 删除 | 从列表消失 |
任务组管理
bohr job_group list -n 10 --json
bohr job_group list -s 2026-01-01 -e 2026-03-14
bohr job_group create -n "experiment-v1" -p YOUR_PROJECT_ID
bohr job_group terminate YOUR_JOB_GROUP_ID
bohr job_group delete YOUR_JOB_GROUP_ID
bohr job_group download -j YOUR_JOB_GROUP_ID -o ./results/
注意:bohr job_group create 创建的 job_group_id 用于 bohr job submit -g <id> 将多个任务归入同一组。此 ID 与 Web 界面上的任务组 ID 不同,仅适用于 CLI 提交。
科学计算软件示例
DeePMD-kit 训练任务
{
"job_name": "DeePMD-kit test",
"command": "cd se_e2_a && dp train input.json > tmp_log 2>&1 && dp freeze -o graph.pb",
"log_file": "se_e2_a/tmp_log",
"backward_files": ["se_e2_a/lcurve.out", "se_e2_a/graph.pb"],
"project_id": YOUR_PROJECT_ID,
"machine_type": "c4_m15_1 * NVIDIA T4",
"job_type": "container",
"image_address": "registry.dp.tech/dptech/deepmd-kit:2.1.5-cuda11.6"
}
LAMMPS 分子动力学
{
"job_name": "lammps_tutorial",
"command": "mpirun -n 32 lmp_mpi -i in.shear > log",
"log_file": "log",
"backward_files": [],
"project_id": YOUR_PROJECT_ID,
"machine_type": "c32_m64_cpu",
"job_type": "container",
"image_address": "registry.dp.tech/dptech/lammps:29Sep2021"
}
ABACUS 第一性原理
{
"job_name": "ABACUS test",
"command": "OMP_NUM_THREADS=1 mpirun -np 8 abacus > log",
"log_file": "log",
"backward_files": [],
"project_id": YOUR_PROJECT_ID,
"machine_type": "c16_m32_cpu",
"job_type": "container",
"image_address": "registry.dp.tech/dptech/abacus:3.0.0"
}
GROMACS 分子模拟
{
"job_name": "bohrium-gmx-example",
"command": "bash rungmx.sh > log",
"log_file": "log",
"backward_files": [],
"project_id": YOUR_PROJECT_ID,
"machine_type": "c16_m62_1 * NVIDIA T4",
"job_type": "container",
"image_address": "registry.dp.tech/dptech/gromacs:2022.2"
}
CP2K 量子化学
{
"job_name": "CP2K_Si_opt",
"command": "source /cp2k-7.1/tools/toolchain/install/setup && mpirun -n 16 --allow-run-as-root --oversubscribe cp2k.popt -i input.inp -o output.log",
"log_file": "output.log",
"backward_files": ["output.log"],
"project_id": YOUR_PROJECT_ID,
"machine_type": "c16_m32_cpu",
"job_type": "container",
"image_address": "registry.dp.tech/dptech/cp2k:7.1"
}
容器镜像与虚拟机镜像映射
| 软件 | 虚拟机镜像 | 容器镜像地址 |
|---|
| DeePMD-kit | LBG_DeePMD-kit_2.1.4_v1 | registry.dp.tech/dptech/deepmd-kit:2.1.5-cuda11.6 |
| DPGEN | LBG_DP-GEN_0.10.6_v3 | registry.dp.tech/dptech/dpgen:0.10.6 |
| LAMMPS | LBG_LAMMPS_stable_23Jun2022_v1 | registry.dp.tech/dptech/lammps:29Sep2021 |
| GROMACS | gromacs-dp:2020.2 | registry.dp.tech/dptech/gromacs:2022.2 |
| Quantum-Espresso | LBG_Quantum-Espresso_7.1 | registry.dp.tech/dptech/quantum-espresso:7.1 |
| CP2K | - | registry.dp.tech/dptech/cp2k:7.1 |
| ABACUS | - | registry.dp.tech/dptech/abacus:3.0.0 |
| 基础镜像 (CPU) | LBG_Common_v1/v2 | registry.dp.tech/dptech/ubuntu:20.04-py3.10 |
| 基础镜像 (GPU) | LBG_base_image_ubun20.04 | registry.dp.tech/dptech/ubuntu:20.04-py3.10-cuda11.6 |
| Intel OneAPI | LBG_oneapi_2021_v1 | registry.dp.tech/dptech/ubuntu:20.04-py3.10-intel2022-cuda11.6 |
API 补充(CLI 不支持的操作)
以下操作 bohr CLI 不支持,需通过 API 完成:
import os, requests
AK = os.environ.get("BOHR_ACCESS_KEY", "")
BASE = "https://open.bohrium.com/openapi/v1"
HEADERS = {"Authorization": f"Bearer {AK}"}
r = requests.get(f"{BASE}/job/list", headers=HEADERS,
params={"page": 1, "pageSize": 10, "status": 1})
r = requests.get(f"{BASE}/job/view/conf/{job_id}", headers=HEADERS)
r = requests.get(f"{BASE}/job/{job_id}/snapshot", headers=HEADERS)
requests.post(f"{BASE}/job/{job_id}/modify",
headers={**HEADERS, "Content-Type": "application/json"},
json={"name": "new-name"})
requests.post(f"{BASE}/job_group/{job_group_id}/modify",
headers={**HEADERS, "Content-Type": "application/json"},
json={"name": "new-group-name"})
任务状态码
| status | 含义 | bohr CLI 显示 |
|---|
| 0 | 等待中 | Pending |
| 1 | 运行中 | Running |
| 2 | 已完成 | Finished |
| 3 | 调度中 | Scheduling |
| -1 | 失败 | Failed |
常见机器规格
| machine_type | 说明 |
|---|
c2_m4_cpu | 2 核 4G 内存 CPU |
c4_m8_cpu | 4 核 8G 内存 CPU |
c8_m32_cpu | 8 核 32G 内存 CPU |
c16_m32_cpu | 16 核 32G 内存 CPU |
c32_m64_cpu | 32 核 64G 内存 CPU |
c4_m15_1 * NVIDIA T4 | 4 核 15G + 1×T4 GPU |
c16_m62_1 * NVIDIA T4 | 16 核 62G + 1×T4 GPU |
c8_m32_1 * NVIDIA V100 | 8 核 32G + 1×V100 GPU |
c32_m128_4 * NVIDIA V100 | 32 核 128G + 4×V100 GPU |
常见错误与排查
| 问题 | 原因 | 解决 |
|---|
cd /root/input: No such file | cmd 中用了绝对路径 | Bohrium 工作目录不可预测,用相对路径 |
unsupported protocol scheme "" | bohr CLI 缺少环境变量 | export OPENAPI_HOST=https://open.bohrium.com && export TIEFBLUE_HOST=https://tiefblue.dp.tech |
(200, '/account/login', None) | 旧版 lbg (pip) 不支持 access_key | 用新版 Go CLI(~/.bohrium/bohr) |
AccessKey Invalid | 直接调用 bohr 时未设置旧变量名 | export ACCESS_KEY="$BOHR_ACCESS_KEY" 后重试 |
| WAF 405 拦截 | cmd 含 shell 关键字被阿里云 WAF 拦截 | 将命令写入脚本文件,cmd 改为 bash run.sh |
Permission error | Job 不属于当前用户 | 确认 BOHR_ACCESS_KEY 对应的用户 |
jobId vs jobGroupId 搞混 | 两个是不同概念 | CLI 中 kill/terminate/delete 均使用 jobId |
| 提交后无输出 | -p 目录下有大隐藏文件 | 检查目录大小,排除不需要的大文件 |
| 同规格任务效率不同 | 算法波动 ~30% + 不同供应商资源差异 | 属正常现象 |
| 任务调度时间长 | 供应商缓存自定义镜像或资源不足 | 耐心等待或联系技术支持 |
| 结果文件撑满系统盘 | 输出写到了系统盘而非数据盘 | 调整脚本输出路径,结果写到工作目录内 |
| 异常中断 | 机器回收或物理机故障(低概率) | 设置 max_reschedule_times 自动重试 |