Skip to content

Releases: r0lfi/layersmith

v0.8.5

Choose a tag to compare

@r0lfi r0lfi released this 20 Oct 07:44

Added

  • Models: Download all for a single model. Open a ready model's files
    and the button saves every part, install-<model>.sh and both checksum
    lists into one folder. In Chrome and Edge you choose the folder, with
    progress, and choosing the same folder again resumes; other browsers use
    their download folder. When it finishes it shows the install command for
    the GPU host. This lets you bring one new model over without a new GPU kit.

Fixed

  • The model's download script was listed twice in the file panel.

v0.8.4

Choose a tag to compare

@r0lfi r0lfi released this 19 Oct 12:15

Fixed

  • GPU benchmark: vLLM failed to start with curand.h: No such file or directory.
    vLLM's FlashInfer sampler compiles a kernel the first time a model is served.
    The cuRAND, cuBLAS and NVRTC headers it needs were in the image, inside the
    PyTorch wheels, but not where nvcc looks. The image now links the missing
    headers and libraries from the wheels into /usr/local/cuda, so the image
    does not grow. The build also compiles a small check file, so a missing
    header now fails the build instead of the first LLM run on a GPU host.
    Rebuild GPU benchmark images to get the fix. Workaround for an existing
    image: run it with -e VLLM_USE_FLASHINFER_SAMPLER=0.

Changed

  • start_container.sh from the GPU kit keeps kernels compiled by vLLM,
    FlashInfer and Triton in $RESULTS_DIR/.cache, so later runs start
    faster. Set CACHE_DIR= to put the cache somewhere else.
  • start_container.sh takes extra podman run options in PODMAN_ARGS,
    for example PODMAN_ARGS="-e NCCL_DEBUG=INFO".

v0.8.3 — Download all

Choose a tag to compare

@r0lfi r0lfi released this 16 Oct 13:31
  • Download all in the GPU kit — one button downloads every file of the kit (image parts, model parts, scripts and checksum lists). In Chrome and Edge you choose an empty folder and each file is streamed straight into it, with progress per file and in total and a Stop button; choosing the same folder again skips the files already there, so a stopped download resumes. Other browsers put the files in their download list one after another. Checksums are verified on the GPU host by setup.sh and the install scripts; download-all.sh remains for downloading from a shell.

Verified in headless Chromium: the button downloaded a 13-file kit (1.02 GB) into the folder with every size and sha256 matching, and a second press skipped all 13.

ghcr.io/r0lfi/layersmith:0.8.3

v0.8.2 — Models in the GPU benchmark wizard

Choose a tag to compare

@r0lfi r0lfi released this 16 Oct 12:36

The GPU benchmark flow in one go: choose models where you choose the image, and the GPU kit is ready when the build is.

  • LLM models in the GPU benchmark wizard — an LLM models card with the H200 list (size, precision, GPUs needed, what is still to download and the free space). Ticked models start downloading when you press Build and run alongside it; they are stored with the project (gpu_benchmark.models, never part of the image).
  • The GPU kit fills itself in — a GPU benchmark build is split into image parts as soon as it is ready, and the models chosen in the wizard are ticked in the kit as soon as their download finishes (the kit lists the ones still pending). One download-all.sh, then bash setup.sh on the GPU host.
  • The wizard's size note now says the .tar is about half the unpacked image, and that loading needs the unpacked size free.
ghcr.io/r0lfi/layersmith:0.8.2

v0.8.1 — Interrupted scans

Choose a tag to compare

@r0lfi r0lfi released this 16 Oct 11:37

Fix on top of v0.8.0 (LLM models and the GPU kit).

  • A scan that a stop, restart or upgrade interrupted showed as "scanning" forever, and blocked deleting its build. Such scans are now marked failed when LayerSmith starts ("Interrupted: … Scan again"), as builds are since 0.7.0.
ghcr.io/r0lfi/layersmith:0.8.1

v0.8.0 — LLM models and the GPU kit

Choose a tag to compare

@r0lfi r0lfi released this 16 Oct 11:00

LLM models for offline GPU hosts

A new Models page downloads open models from Hugging Face for the GPU benchmark image and hands them over in parts under 1 GB.

  • Curated list for NVIDIA H200 — smoke test (Qwen2.5-0.5B), 8B baseline in BF16 and FP8, MoE (gpt-oss-20b, Qwen3-30B-A3B), mid-size dense (phi-4, Qwen3-32B), large single-GPU (gpt-oss-120b, Llama-3.3-70B FP8) and multi-GPU (Qwen2.5-72B, Qwen3-235B-A22B FP8), with size, precision and the number of GPUs each needs. Or enter any Hugging Face model id.
  • Only what vLLM loads is downloaded (config, tokenizer, *.safetensors), from one resolved commit. Weights are checked against the sha256 Hugging Face publishes, small files against their Git blob id; a mismatch never becomes "ready".
  • Resumable: downloads continue after a network error, a restart or an upgrade (HTTP range requests). Space is checked before a download starts.
  • No copies on disk: a model is stored once as a folder; its download is an uncompressed tar stream generated from that folder and split into parts of at most 900 MB.
  • install-<model>.sh checks the parts, unpacks with cat | tar -x straight into /opt/models/<model>, and verifies every file. download-<model>.sh fetches all parts with resume and checksum checks.
  • Only open models: gated repositories (Meta Llama, Google Gemma) are refused, and no tokens are stored. The list uses RedHatAI's open copies of Llama.

New setting LAYERSMITH_MODEL_DIR (default $DATA/models, also under Settings → Storage) and LAYERSMITH_HF_ENDPOINT for a mirror. See docs/models.md.

GPU kit: one command on the GPU host

A GPU benchmark build page now has a GPU kit: tick models, prepare the image parts, download download-all.sh and run it where LayerSmith is reachable. It fetches the image parts, model parts and scripts, resumes, and verifies every part. On the GPU host:

bash setup.sh

setup.sh checks the host and the free space per filesystem (archive, podman's $TMPDIR scratch space, the image store, the models directory) before it touches anything, restores and loads the image, installs each model into /opt/models, generates the CDI spec with sudo nvidia-ctk cdi generate if it is missing, and starts the dashboard. Every step is skipped once done, so it can be re-run. --no-start, --models-dir and TMPDIR= are supported. start_container.sh starts the dashboard again later (GPUS=0, MODELS_DIR=…, or any gpu-bench command).

Also

  • The GPU benchmark guide mounts /opt/models, gives the real image size (about 10–15 GB unpacked, 4.6 GB archive and what loading needs), and covers statfs /models: no such file or directory, unresolvable CDI devices and no space left on device during podman load.
  • The generated scripts run on bash 4.2 (RHEL/CentOS 7) and newer, and pass shellcheck.

Verified: a real download of Qwen2.5-0.5B-Instruct from Hugging Face, fetched with download-*.sh and installed with install-*.sh, gives weights byte-identical to Hugging Face's published sha256. setup.sh is covered end to end in the test suite with stand-ins for podman and the NVIDIA tools; it has not been run on a real GPU host yet.

Upgrade notes

  • Unfinished model downloads resume when LayerSmith starts. As in 0.7.0, a build running during an upgrade is marked failed — let it finish first.
  • The new llm_models table is created automatically.
ghcr.io/r0lfi/layersmith:0.8.0

v0.7.0 — Split archives and build deletion

Choose a tag to compare

@r0lfi r0lfi released this 16 Oct 09:44

Split image archives

Some environments refuse any single file of 1 GB or more. Under Image archive on a build page there is now Download split archive: the same podman save / docker save archive in parts of at most 900 MB, plus a script that puts it back together.

  • No compression, no conversion: the parts concatenated in order are byte for byte the original, with the same sha256, and podman load -i gives the same layers, metadata and tags.
  • The parts are byte ranges of the existing export, streamed on download — nothing is copied on disk and there are no temporary files. Download TAR is unchanged.
  • The server computes a checksum per part in one background read, with progress on the page, and re-verifies the archive against the checksum recorded at export time.
  • Each part, assemble-image.sh, <name>.tar.sha256 and <name>.parts.sha256 has its own download button.

On the receiving host only bash and coreutils are needed:

chmod +x assemble-image.sh
./assemble-image.sh          # check, reassemble, verify
./assemble-image.sh --load   # ... then podman load -i

The script checks every part's presence, size and sha256, checks free space, reassembles to a temporary file, verifies size and sha256 against the original and only then renames it. Missing or corrupt parts are named and nothing is written; an interrupted run cleans up after itself. Options: --load, --remove-parts, --force, --dir. See docs/split-archive.md.

Verified with a real Podman build (2 GB image → 3 parts → reassembled → loaded with the same image ID and run), on bash 5.2 and bash 4.2 (CentOS 7), and with shellcheck.

Delete builds

The Builds list has a Delete button per build. It removes the record, its export and air-gap archives, log, scan results and the image in the local runtime store. A file or image another build still uses is kept — a project deleted and created again builds the same reference and archive name. Running builds (and builds with a running scan) cannot be deleted. API: DELETE /api/builds/{id} (?remove_image=false keeps the image).

Fixes

  • Creating a project with the name of a deleted project failed with 500 Internal Server Error (UNIQUE constraint failed: projects.name). The deleted project now gives up its name; its builds stay listed under the name it had, marked (deleted project).
  • Builds left running by a stop, restart or upgrade showed as running forever. They are now marked failed at startup ("Interrupted: … Start the build again").
  • The web UI read the server's UTC timestamps as local time, so a fresh build showed as "2 h ago" at UTC+2.

Upgrade notes

  • A build that is running while you upgrade is marked failed when the new version starts — let running builds finish first.
  • New optional setting LAYERSMITH_SPLIT_PART_BYTES (default and maximum 900000000).
  • /api/health adds split-archive and delete-build to api_features. No database migration is needed: the new column is added automatically.
ghcr.io/r0lfi/layersmith:0.7.0

LayerSmith 0.6.0

Choose a tag to compare

@r0lfi r0lfi released this 15 Oct 12:09

The NVIDIA GPU & LLM Benchmark template grows into a full benchmark suite.

In the benchmark image (gpu-bench)

  • Interactive terminal dashboard, started by default when the container runs in a terminal (podman run --rm -it …): system overview, live GPU status, health, and every benchmark from one screen.
  • Run history (gpu-bench runs), comparisons, topology (gpu-bench topology) and local models (gpu-bench models).
  • Multi-node NCCL collectives with torchrun (gpu-bench dist, no MPI or SSH needed), plus Slurm, MPI and Podman multi-node scripts under /opt/gpu-bench/scripts.
  • Reworked LLM (vLLM), compute, memory and NCCL benchmarks and HTML/JSON/CSV reports. nvbandwidth replaces bandwidthTest.

In LayerSmith

  • The build page explains how to download, verify (sha256sum -c) and podman load the image. There is a new export.sha256 download.
  • GPU benchmark builds check free disk space before they start. LAYERSMITH_GPU_MIN_FREE_GB overrides the check.

Verified for this release: backend and client test suites, the frontend build, and a real Podman build of the benchmark image (10.1 GB, 4.6 GB export). Inside that image the toolchain was checked offline, the dashboard renders, and on a host without a GPU, health and full report clearly what is missing. No GPU hardware was available, so this release has no measured GPU numbers.

Full Changelog: v0.5.0...v0.6.0

LayerSmith 0.5.0

Choose a tag to compare

@r0lfi r0lfi released this 15 Oct 07:59

Full Changelog: v0.4.0...v0.5.0

v0.4.0 — The terminal client

Choose a tag to compare

@r0lfi r0lfi released this 03 Oct 08:06

The terminal client: use LayerSmith from a jumphost, a laptop or an admin server, through the same API as the web UI.

LayerSmith terminal client

New

layersmith, a terminal client for a LayerSmith server. A separate, pure-Python package (Python 3.9+) that runs on any machine that can reach the server over HTTP(S). It needs no container runtime, no LayerSmith server installation, no access to the container host and no docker exec.

  • Interactive interface - run layersmith for a keyboard-driven TUI: dashboard, projects with the selected project's details and the live log of its latest build, the image and LLM training wizards, builds, scans, exports, settings and a connection page with a read-only doctor. It works at 80x24, needs no special font, and every status is a word as well as a colour (NO_COLOR is honoured).
  • Command line for scripts - the web UI's functions as commands (projects, build, builds, export, bundle, scan, scans, training, settings, ...), with --json, JSON Lines for followed jobs, documented exit codes, no prompts without a terminal and --yes for destructive actions.
  • Remote by design - local files are uploaded through the API; downloads stream to the client machine and are checked against the SHA256 the server recorded before they get their name. Builds keep running when the client quits or the SSH session drops; layersmith builds wait <id> re-attaches. A change whose answer was lost is never repeated automatically.
  • Network - TLS is always verified (an internal CA is supported with ca_cert), redirects and HTML login pages are errors rather than answers, and HTTP Basic or client certificates work for an authenticating proxy in front of LayerSmith. LayerSmith itself still has no logins, by design.

Install from the files attached to this release - the wheel, or the offline archive with every dependency for Python 3.9-3.13:

curl -LO https://github.com/r0lfi/layersmith/releases/download/v0.4.0/layersmith-client-0.4.0-offline.tar.gz
tar -xzf layersmith-client-0.4.0-offline.tar.gz && cd layersmith-client-0.4.0-offline
sha256sum -c SHA256SUMS
pipx install --pip-args="--no-index --find-links=$PWD/wheelhouse" layersmith-client
layersmith config set server https://layersmith.example.org
layersmith doctor

The client is not on PyPI. Guide: docs/client.md; what it covers of the web UI: docs/client-features.md.

API additions

All additive; existing clients are unaffected.

  • GET /api/builds/{id}/log?offset=N (or ?tail=N) returns a slice of a build log by byte offset, so a client can resume without fetching the whole log again.
  • /api/health lists api_features.
  • /api/settings reports the upload, file-count and build-context limits the server enforces.

The client also works against a 0.3.x server; it then follows logs through the part of the log the server returns with a build, and layersmith doctor says so.

Verified for this release

  • The client test suite (CLI, the TUI headless, and the CLI against the real API with a fake build runtime) on Python 3.9, 3.12 and 3.13 in CI; the backend suite and frontend build as before.
  • The offline archive installed with networking disabled on Python 3.9 to 3.13 (venv) and with pipx.
  • End to end from a separate client container with no server code, data or runtime socket, against a server doing real Podman builds: configure, create a project with an uploaded file, build from the CLI, follow it in the TUI, quit mid-build, re-attach by id, download the archive and air-gap bundle, checksums matching.

Not verified: the TUI in specific terminal emulators beyond headless rendering, a real scanner from the client (findings filters and SBOM download), recording a GPU report, and macOS.

Upgrading

No database change.

docker compose pull && docker compose up -d

Full changelog: v0.3.1...v0.4.0