Manage compute jobs on the Bohrium platform. Prefer bohr CLI; fall back to the API only for advanced operations not supported by the CLI.
ACCESS_KEY and PROJECT_ID are read from the OpenClaw config ~/.openclaw/openclaw.json:
json
"bohrium-job": {
"enabled": true,
"apiKey": "YOUR_ACCESS_KEY",
"env": {
"ACCESS_KEY": "YOUR_ACCESS_KEY",
"PROJECT_ID": "YOUR_PROJECT_ID"
}
}
OpenClaw automatically injects env variables into the runtime. The bohr CLI authenticates via the ACCESS_KEY environment variable.
bash
# macOS
/bin/bash -c "$(curl -fsSL https://dp-public.oss-cn-beijing.aliyuncs.com/bohrctl/1.0.0/install_bohr_mac_curl.sh)"
# Linux
/bin/bash -c "$(curl -fsSL https://dp-public.oss-cn-beijing.aliyuncs.com/bohrctl/1.0.0/install_bohr_linux_curl.sh)"
# Verify
source ~/.bashrc # or source ~/.zshrc
export PATH="$HOME/.bohrium:$PATH"
bohr version
The installer auto-configures
OPENAPI_HOSTandTIEFBLUE_HOST. If they don't take effect, set manually:bash
export OPENAPI_HOST=https://open.bohrium.com export TIEFBLUE_HOST=https://tiefblue.dp.tech
bash
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 154 \
-n "my-job-name"
Parameters:
ParameterShortRequiredDescription--image_address``-mYesFull image URL (e.g. registry.dp.tech/dptech/xxx:tag)--machine_type``-tYesMachine spec--command``-cYesCommand to execute--input_directory``-pNoInput file directory (default ./)--project_idYesProject ID--job_name``-nNoJob name--log_file``-lNoLog file path--result_path``-rNoAuto-download results path (only /data, /personal, /share)--job_group_id``-gNoJob group ID (create with bohr job_group create)--max_run_timeNoMax run time (minutes); auto-terminates on timeout--max_reschedule_timesNoAuto-retry count after abnormal interruption--nnodeNoParallel compute node count (default 1)
bash
bohr job submit -i job.json -p ./input_dir/
Full job.json example:
json
{
"job_name": "my-training-job",
"command": "python train.py --epochs 10",
"log_file": "train.log",
"backward_files": ["model.pt", "results/"],
"project_id": 154,
"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 field reference:
FieldDescriptionExamplejob_nameJob name"DeePMD-kit test"``commandCommand; use relative paths"cd se_e2_a && dp train input.json"``log_fileLog viewable in real-time"train.log"``backward_filesFiles to download; empty = keep all["model.pt", "results/"]``project_idProject ID154``machine_typeMachine spec"c4_m15_1 * NVIDIA T4"``image_addressFull image URL (not just name)"registry.dp.tech/dptech/deepmd-kit:2.1.5-cuda11.6"``job_typeMust be "container"``"container"``dataset_pathMounted dataset paths["/bohr/my-dataset/v1"]``result_pathAuto-collect results to data disk"/personal"``max_run_timeMax run time (minutes)120``max_reschedule_timesRetry count on interruption2``disk_sizeDisk size (GB)50
TopicDetailsWorking directoryBohrium auto- cd s into the extracted input dir; use relative paths****Do NOT cd /root/inputActual path is /home/input_lbg-{userId}-{jobId}/, unpredictableimage_address formatMust be full URL registry.dp.tech/dptech/xxx:tagmachine_type formatCPU: c2_m4_cpu; GPU: c4_m15_1 * NVIDIA T4WAF blockingIf command triggers Alibaba Cloud WAF (405), write to script, use bash run.shLarge files in -pNo output? Check for large hidden files causing slow compressionAuto-retrymax_reschedule_times retries on interruption (full re-run)job_typeMust be "container"; VM jobs deprecated since 2023
bash
bohr job list -n 10 # Recent 10
bohr job list -n 5 --json # JSON output
bohr job list -r # Running only
bohr job list -f # Failed only
bohr job list -i # Finished only
bohr job list -p # Pending only
bohr job list -j 15954383 # Jobs in a specific group
bash
bohr job describe -j 22153612 --json
bohr job describe -j 22153612 -l # Full details
bash
bohr job log -j 22153612 # View
bohr job log -j 22153612 -o ./logs/ # Download
bash
bohr job download -j 22153612 -o ./results/
bohr job_group download -j 15954383 -o ./results/
bash
bohr job terminate 22153612 # Terminate (keep results -> completed)
bohr job kill 22153612 # Force stop (discard results, keep record)
bohr job delete 22153612 # Delete (remove everything)
bohr job terminate 22153612 22153613 # Batch terminate
bohr job delete 22153612 22153613 # Batch delete
terminate vs kill vs delete:
ActionResult filesRecordStatusterminateKeptKept-> completedkillDiscardedKept-> faileddeleteRemovedRemovedDisappears
bash
bohr job_group list -n 10 --json
bohr job_group list -s 2026-01-01 -e 2026-03-14 # Date range
bohr job_group create -n "experiment-v1" -p 154
bohr job_group terminate 15954383
bohr job_group delete 15954383
bohr job_group download -j 15954383 -o ./results/
Note:
job_group_idfrombohr job_group createis for CLI only (bohr job submit -g <id>). It differs from the web UI job group ID.
json
{
"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": 154,
"machine_type": "c4_m15_1 * NVIDIA T4",
"job_type": "container",
"image_address": "registry.dp.tech/dptech/deepmd-kit:2.1.5-cuda11.6"
}
json
{
"job_name": "lammps_tutorial",
"command": "mpirun -n 32 lmp_mpi -i in.shear > log",
"log_file": "log",
"backward_files": [],
"project_id": 154,
"machine_type": "c32_m64_cpu",
"job_type": "container",
"image_address": "registry.dp.tech/dptech/lammps:29Sep2021"
}
json
{
"job_name": "ABACUS test",
"command": "OMP_NUM_THREADS=1 mpirun -np 8 abacus > log",
"log_file": "log",
"backward_files": [],
"project_id": 154,
"machine_type": "c16_m32_cpu",
"job_type": "container",
"image_address": "registry.dp.tech/dptech/abacus:3.0.0"
}
json
{
"job_name": "bohrium-gmx-example",
"command": "bash rungmx.sh > log",
"log_file": "log",
"backward_files": [],
"project_id": 154,
"machine_type": "c16_m62_1 * NVIDIA T4",
"job_type": "container",
"image_address": "registry.dp.tech/dptech/gromacs:2022.2"
}
json
{
"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": 154,
"machine_type": "c16_m32_cpu",
"job_type": "container",
"image_address": "registry.dp.tech/dptech/cp2k:7.1"
}
SoftwareVM ImageContainer ImageDeePMD-kitLBG_DeePMD-kit_2.1.4_v1registry.dp.tech/dptech/deepmd-kit:2.1.5-cuda11.6DPGENLBG_DP-GEN_0.10.6_v3registry.dp.tech/dptech/dpgen:0.10.6LAMMPSLBG_LAMMPS_stable_23Jun2022_v1registry.dp.tech/dptech/lammps:29Sep2021GROMACSgromacs-dp:2020.2registry.dp.tech/dptech/gromacs:2022.2Quantum-EspressoLBG_Quantum-Espresso_7.1registry.dp.tech/dptech/quantum-espresso:7.1CP2K-registry.dp.tech/dptech/cp2k:7.1ABACUS-registry.dp.tech/dptech/abacus:3.0.0Base (CPU)LBG_Common_v1/v2registry.dp.tech/dptech/ubuntu:20.04-py3.10Base (GPU)LBG_base_image_ubun20.04registry.dp.tech/dptech/ubuntu:20.04-py3.10-cuda11.6Intel OneAPILBG_oneapi_2021_v1registry.dp.tech/dptech/ubuntu:20.04-py3.10-intel2022-cuda11.6
python
import os, requests
AK = os.environ.get("ACCESS_KEY", "")
BASE = "https://open.bohrium.com/openapi/v1"
HEADERS = {"accessKey": AK}
# Filter by status (0=pending, 1=running, 2=finished, 3=scheduling, -1=failed)
r = requests.get(f"{BASE}/job/list", headers=HEADERS,
params={"page": 1, "pageSize": 10, "status": 1})
# Job config (includes file access token)
r = requests.get(f"{BASE}/job/view/conf/{job_id}", headers=HEADERS)
# Returns: {state, baseDir, tempDir, token, host, expires}
# View snapshot
r = requests.get(f"{BASE}/job/{job_id}/snapshot", headers=HEADERS)
# Rename job
requests.post(f"{BASE}/job/{job_id}/modify",
headers={**HEADERS, "Content-Type": "application/json"},
json={"name": "new-name"})
# Rename job group
requests.post(f"{BASE}/job_group/{job_group_id}/modify",
headers={**HEADERS, "Content-Type": "application/json"},
json={"name": "new-group-name"})
statusMeaningCLI Display0PendingPending1RunningRunning2FinishedFinished3SchedulingScheduling-1FailedFailed
machine_typeDescriptionc2_m4_cpu2 cores, 4G RAMc4_m8_cpu4 cores, 8G RAMc8_m32_cpu8 cores, 32G RAMc16_m32_cpu16 cores, 32G RAMc32_m64_cpu32 cores, 64G RAMc4_m15_1 * NVIDIA T44 cores, 15G + 1x T4c16_m62_1 * NVIDIA T416 cores, 62G + 1x T4c8_m32_1 * NVIDIA V1008 cores, 32G + 1x V100c32_m128_4 * NVIDIA V10032 cores, 128G + 4x V100
ProblemCauseSolutioncd /root/input: No such fileAbsolute path in commandUse relative pathsunsupported protocol scheme ""Missing env varsSet OPENAPI_HOST and TIEFBLUE_HOST``(200, '/account/login', None)Old pip lbgUse Go CLI ( ~/.bohrium/bohr)WAF 405Shell keywords in commandWrite to script, use bash run.sh``Permission errorWrong userVerify ACCESS_KEYjobId vs jobGroupIdDifferent conceptsCLI uses jobId for kill/terminate/deleteNo output after submitLarge hidden files in -p dirCheck dir sizeVariable performance~30% algorithm varianceNormalLong schedulingImage caching or resource shortageWait or contact supportSystem disk fullOutput to system diskWrite to working directoryAbnormal interruptionMachine reclaim (rare)Set max_reschedule_times