Every role runs from an image: the agent, the judge and the inference server. Under the CSCS Container Engine
an image is named by its EDF (~/.edf/<name>.toml); under Apptainer, Podman or Docker by an image reference.
Building, verifying and publishing the images: containers/README.md. How each runtime
starts a step: runtime.md.
One registry tag per image, in docker.io/spcleth/hpcagent-bench (containers/images/images.env):
| tag | build directory | CPU / GPU | toolkit | EDF |
|---|---|---|---|---|
agent-amd-latest, judge-amd-latest |
judge-agent-amd |
x86-64-v3; gfx90a, gfx942, gfx950 | ROCm | hpcagent-bench-{agent,judge}-{mi300,mi200}-latest |
agent-nvidia-latest, judge-nvidia-latest |
judge-agent-cuda |
aarch64 (GH200); sm_80 to sm_120 | CUDA 13.4.1 (NGC PyTorch 26.09) | hpcagent-bench-{agent,judge}-gh200-latest |
agent-nvidia-x86_64-latest, judge-nvidia-x86_64-latest |
judge-agent-cuda built on x86_64 |
x86-64-v3; sm_75 to sm_120 | CUDA 13.4.1 | hpcagent-bench-{agent,judge}-nvidia-x86_64-latest |
agent-cpu-<arch>-latest, judge-cpu-<arch>-latest |
judge-agent-cpu |
x86-64-v3 or armv8.2-a | none | hpcagent-bench-{agent,judge}-cpu-<arch>-latest |
verifier-{amd,nvidia,nvidia-x86_64,cpu-<arch>}-latest |
verifier |
the judge's | the judge's | none: Harbor pulls it (why) |
sglang-mi300-latest |
sglang |
gfx942, gfx90a | ROCm | hpcagent-bench-sglang-mi300-latest |
vllm-amd-latest |
vllm |
gfx90a, gfx942, gfx950 | ROCm | hpcagent-bench-vllm-{mi300,mi200}-latest |
vllm-gh200-latest |
vllm-cuda |
aarch64 only | CUDA 12.9 (vLLM v0.28.0) | hpcagent-bench-vllm-gh200-latest |
Which of them are published is the registry's listing, not this page:
curl -s 'https://hub.docker.com/v2/repositories/spcleth/hpcagent-bench/tags?page_size=100'. A row whose tag is
not listed is built locally (containers/images/build_and_verify.sbatch <dir>) before it is used. With
CE_IMAGE_FLAVOR=native the agent and judge EDFs are the -native builds instead of -latest
(containers/README.md).
Get an image and its EDF (the EDFs mount $SCRATCH, so run this on the cluster that will use them):
sbatch containers/images/registry.sbatch pull judge-agent-amd # a role of images.env
containers/images/install_edfs.sh # the node's platform; CE_PLATFORM=amd | gh200 | nvidia-x86 | cpu names one
ls ~/.edf/| what runs | Container Engine | other runtimes (CONTAINER_RUNTIME=apptainer | podman | docker) |
|---|---|---|
| an experiment's agent | AMD_CE_ENV (or AGENT_CE_ENV for the agent step alone) |
BENCH_IMAGE |
| an experiment's judge | JUDGE_CE_ENV |
BENCH_IMAGE |
| an experiment's inference server | INFERENCE_CE_ENV |
INFERENCE_IMAGE |
a helper job (grade-under, prepare) |
JUDGE_EDF=~/.edf/<name>.toml |
(CE only) |
| the Harbor adapter | -- | images: in the configuration (HPCAGENT_BENCH_IMAGES_<HW>_AGENT / _VERIFIER) |
the local container launch (helpers/scripts/run_agent_in_container.sh) |
-- | HPCAGENT_BENCH_DOCKER_IMAGE or HPCAGENT_BENCH_SIF, else container_backends.txt (hpcagent_bench:<hw>, or a .sif in the checkout) |
The *_CE_ENV values are EDF names (no path, no .toml). [common] sets the MI300 pair,
AMD_CE_ENV=hpcagent-bench-agent-mi300-latest and JUDGE_CE_ENV=hpcagent-bench-judge-mi300-latest; a setup's
.env or the shell overrides them. submit.sh --hardware <hardware> renames every *_CE_ENV from -mi300- to
-<hardware>- and pins [hardware.<hardware>] (configuration.md),
so a hardware with a layer needs no EDF edit:
TAG=llr40 hpcagent_bench/cluster/submit.sh --hardware mi200 # the -mi200- EDFs
TAG=llr40 JUDGE_CE_ENV=my-judge-candidate hpcagent_bench/cluster/submit.sh # one role, any EDF in ~/.edf
JUDGE_EDF=~/.edf/hpcagent-bench-judge-cpu-x86_64-latest.toml \
hpcagent-bench job submit --nodes 1 hpcagent_bench/cluster/prepare.sbatch --tag llr40 --language cExperiments (submit.sh) run on the hardware that has layers, mi300 (the base), mi200 and gh200; under the
Container Engine submit.sh refuses a run with no hardware or with a hardware that has no
[hardware.<hardware>]. x86 NVIDIA nodes run the helper jobs and the CLI with their
own EDFs; containers/README.md shows a Daint job using a Beverin
inference endpoint.