Skip to main content

fherma-runner

Takes measurement jobs from a FHERMA platform and reports what happened.

uv tool install fherma-runner        # or: pipx install fherma-runner
fherma-runner --api https://fherma.io --name bench-01 --token fhr_...

A command line tool belongs in an environment of its own, and on macOS it has no choice: the system Python has no pip on the path at all, and Homebrew's is marked externally managed so installing into it is refused. uv tool and pipx both make that environment and leave fherma-runner on the path, which is the part pip install --user does not do.

Neither installed? One line, and nothing else on the machine changes:

curl -LsSf https://astral.sh/uv/install.sh | sh

Check what you got:

$ fherma-runner --version
fherma-runner 0.3.0 · python 3.13.4

The token comes from the platform, is good for an hour and is spent once: the first start exchanges it for this runner's own key and keeps that in ~/.fherma/runners/<name>/key. Every start after the first needs no token.

--api is the API, not the website. They are usually different hosts, and a website answers an unknown path with a page and a 200 rather than an error — so the wrong one here fails as "answered with something that is not JSON".

Every start says what the machine is now, so a server that was re-provisioned is matched on what it is rather than on what it was.

Several on one machine

A machine can hold more than one: a card that is free while the CPU is busy, or two cards, or one runner kept for reference work and one for everything else. Each is its own runner on the platform, with its own invitation and its own key.

fherma-runner --name box-cpu --token fhr_...
fherma-runner --name box-gpu-0 --token fhr_...
fherma-runner --name box-gpu-1 --token fhr_...

--name is what keeps them apart on the machine as well as on the platform: the key and the jobs both live under it.

~/.fherma/runners/<name>/
├── key       this runner's own, 0600
└── jobs/     what it is working on

Nothing is shared between them, which is the point — one key answering to two names would be one runner behaving very strangely, and a jobs directory two of them both tidy up is a directory that gets tidied up under one of them.

They do share the machine, so give each one limits it can actually have: --memory and --cpus are per runner and docker will not divide what you promise twice.

What it needs

An interpreter and docker. There are no dependencies: everything here ships with Python, and docker is called as a command.

What it declares

Hardware, and only hardware — cores, memory, architecture, CPU features, an accelerator and its driver. It does not declare libraries or images, because the environment a job runs in is not a property of a machine: it arrives with the job, pinned to a digest.

fherma-runner --describe

prints what it would report, and stops.

What it does with a job

~/.fherma/runners/<name>/jobs/<id>/
├── bundle/     the specification's bundle, unpacked
├── solution/   the repository at the commit, and its build
└── points/
    └── p000/   one point at a time, deleted once reported

Per point: the bundle makes the cases, the solution answers them, the bundle judges the answers. Three containers, and the solution is never given the directory holding the expected answers.

Options

--api           where the API is, not the website      FHERMA_API
--name          what to call this runner               FHERMA_RUNNER_NAME
--token         an invitation, spent once for a key
--interval      seconds between polls                  3
--once          take one assignment, then stop
--describe      print what this machine is, and stop
--version       what is installed, and on what
--re-register   forget this name's key and join again
--memory        what a solution's container may take   FHERMA_MEMORY
--cpus          how many cores it may use              FHERMA_CPUS

The --speed, --fail-rate, --build-seconds and --point-seconds options belong to the half that is still pretended, and go away with it.

Stopping

The platform stops a runner by refusing its heartbeat. It then drops everything at once and sends nothing: finishing the work and reporting it would be reporting into a result somebody else now owns.

If a runner goes quiet instead, its lease lapses, the run is marked expired and the job goes to another machine.

Licence

Apache-2.0.

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

fherma_runner-0.3.0.tar.gz (25.7 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

fherma_runner-0.3.0-py3-none-any.whl (28.8 kB view details)

Uploaded Python 3

File details

Details for the file fherma_runner-0.3.0.tar.gz.

File metadata

  • Download URL: fherma_runner-0.3.0.tar.gz
  • Upload date:
  • Size: 25.7 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for fherma_runner-0.3.0.tar.gz
Algorithm Hash digest
SHA256 f0cfa7cbad7eef24fb53cecb2e93c1032946d5c945670fbb7bfdd0590366a406
MD5 d4c3f6afafc0fd4e2cbc711190a96c55
BLAKE2b-256 ee1a3ac9ca312dfee1be0f7a41ed860bcaa8eb3df25f032ab612c7e59e01094a

See more details on using hashes here.

Provenance

The following attestation bundles were made for fherma_runner-0.3.0.tar.gz:

Publisher: publish.yml on fairmath/fherma-runner

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file fherma_runner-0.3.0-py3-none-any.whl.

File metadata

  • Download URL: fherma_runner-0.3.0-py3-none-any.whl
  • Upload date:
  • Size: 28.8 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for fherma_runner-0.3.0-py3-none-any.whl
Algorithm Hash digest
SHA256 40cdcde210c3f6b05ac48b56a14e52dc169375bf44d8f9b031cb9df5e3ff3242
MD5 ca68377ff531e8a741a5051c236d743b
BLAKE2b-256 6de82968f313101c507b0f62af352855f690bbe1c5b0d9eac765955c428ce07a

See more details on using hashes here.

Provenance

The following attestation bundles were made for fherma_runner-0.3.0-py3-none-any.whl:

Publisher: publish.yml on fairmath/fherma-runner

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Release history Release notifications | RSS feed

0.6.0

2 files

0.5.0

2 files

0.4.0

2 files

0.3.1

2 files

This release

0.3.0 This release

2 files

0.2.0

2 files

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page