From f6c2f5a65046df8cde3cf6807963e5cef996b1ed Mon Sep 17 00:00:00 2001 From: Dawn Date: Tue, 18 Aug 2026 11:13:19 +0200 Subject: [PATCH] Drop careless-gpu: the [cuda] pip extra install covers GPU and CPU nodes The installed careless/0.5.4 venv already contains the NVIDIA wheels ([cuda] extra), which need only the node driver and fall back to CPU, so a separate GPU module and cuda module dep are unnecessary. Revert careless/build to careless[cuda] to match the actual install. Co-Authored-By: Claude Fable 5 --- careless-gpu/README.md | 28 ---------------------------- careless-gpu/build | 26 -------------------------- careless-gpu/files/config.yaml | 13 ------------- careless-gpu/modulefile | 16 ---------------- careless/README.md | 12 ++++-------- careless/build | 10 +++++----- careless/modulefile | 5 +++-- 7 files changed, 12 insertions(+), 98 deletions(-) delete mode 100644 careless-gpu/README.md delete mode 100755 careless-gpu/build delete mode 100644 careless-gpu/files/config.yaml delete mode 100644 careless-gpu/modulefile diff --git a/careless-gpu/README.md b/careless-gpu/README.md deleted file mode 100644 index fab39aa..0000000 --- a/careless-gpu/README.md +++ /dev/null @@ -1,28 +0,0 @@ -# careless-gpu - -GPU build of careless (see `../careless/` for the CPU module and the full -background). Scaling and merging of X-ray diffraction data with approximate -Bayesian inference (variational merging), built on TensorFlow. - -- Upstream: https://github.com/rs-station/careless -- License: MIT - -## How it differs from the careless module - -- CUDA is not pip-installed (no `[cuda]` extra, saves several GB): the - cluster `cuda/12.8.1` module provides it instead, declared as - `build_requires`/`runtime_deps` (same pattern as `jfjoch_viewer`). - `runtime_deps` matters because TensorFlow dlopens the CUDA libraries - when careless runs, so cuda must auto-load with this module. -- If careless reports missing cuDNN at runtime, the cuda module does not - ship it; the fallback is installing `careless[cuda]` in `build` instead. - -The venv layout, uv usage, and cache handling are identical to `careless`. -To share one download cache between both builds, run each with -`UV_CACHE_DIR= modbuild build ` — a cache outside -PREFIX is kept, an in-PREFIX cache is removed after a successful install. - -## Adding a new version - -Add the version under `versions:` in `files/config.yaml`, then on a Ra -login node: `modbuild build ` (modbuild/2.1.2). diff --git a/careless-gpu/build b/careless-gpu/build deleted file mode 100755 index 49cb4e9..0000000 --- a/careless-gpu/build +++ /dev/null @@ -1,26 +0,0 @@ -#!/usr/bin/env modbuild - -pbuild::prep() { - : -} - -pbuild::configure() { - # same uv pattern as the careless (CPU) module; see that build for the whys - UV="${UV:-$HOME/.local/bin/uv}" - export UV_CACHE_DIR="${UV_CACHE_DIR:-$PREFIX/.uv-cache}" - export UV_PYTHON_INSTALL_DIR="$PREFIX/python" - "$UV" venv --python 3.12 "$PREFIX/venv" -} - -pbuild::compile() { - : -} - -pbuild::install() { - UV="${UV:-$HOME/.local/bin/uv}" - export UV_CACHE_DIR="${UV_CACHE_DIR:-$PREFIX/.uv-cache}" - # no [cuda] extra: CUDA comes from the cuda/12.8.1 module - # (build_requires/runtime_deps in files/config.yaml), not from pip wheels - "$UV" pip install --python "$PREFIX/venv/bin/python" "careless==${V_PKG}" - [[ "$UV_CACHE_DIR" == "$PREFIX"* ]] && rm -rf "$UV_CACHE_DIR" || : -} diff --git a/careless-gpu/files/config.yaml b/careless-gpu/files/config.yaml deleted file mode 100644 index 1a7f199..0000000 --- a/careless-gpu/files/config.yaml +++ /dev/null @@ -1,13 +0,0 @@ ---- -format: 1 -careless-gpu: - defaults: - group: MX - overlay: base - relstage: unstable - versions: - 0.5.4: - config: - relstage: unstable - build_requires: ["cuda/12.8.1"] - runtime_deps: ["cuda/12.8.1"] diff --git a/careless-gpu/modulefile b/careless-gpu/modulefile deleted file mode 100644 index 486cb39..0000000 --- a/careless-gpu/modulefile +++ /dev/null @@ -1,16 +0,0 @@ -#%Module1.0 - -module-whatis "careless (GPU) - merging crystallography data with variational inference" -module-url "https://github.com/rs-station/careless" -module-license "MIT" -module-maintainer "MX Data " - -module-help " -careless: scaling and merging of X-ray diffraction data using -approximate Bayesian inference (TensorFlow). GPU build: CUDA is -provided by the cuda/12.8.1 module, auto-loaded as a runtime dep. -Use on nodes with an NVIDIA GPU; for CPU nodes load careless instead. -" - -setenv CARELESS_ENV $PREFIX/venv -prepend-path PATH $PREFIX/venv/bin diff --git a/careless/README.md b/careless/README.md index 757adc9..084cb8a 100644 --- a/careless/README.md +++ b/careless/README.md @@ -11,14 +11,10 @@ inference (variational merging), built on TensorFlow. Upstream recommends a fresh conda env, but repo.anaconda.com is not reachable from Ra, so the build uses uv instead: it fetches a standalone Python 3.12 into `$PREFIX/python` (upstream supports >=3.9,<3.13), creates -`$PREFIX/venv`, and runs `uv pip install careless==` into it. -This is the CPU build; the GPU build (with the `[cuda]` extra and the -cluster `cuda/12.8.1` module) is the separate `careless-gpu` module. - -To share one uv download cache between the careless and careless-gpu -builds, run each with `UV_CACHE_DIR= modbuild build ` -— a cache outside PREFIX is kept, an in-PREFIX cache is removed after a -successful install. +`$PREFIX/venv`, and runs `uv pip install careless[cuda]==` into +it. The `[cuda]` extra ships the NVIDIA libraries (CUDA, cuDNN, ...) as +pip wheels, so the one install uses the GPU on GPU nodes (only the node's +NVIDIA driver is needed — no cuda module) and falls back to CPU elsewhere. `uv` must be on PATH on the build host (e.g. `pip install --user uv`). diff --git a/careless/build b/careless/build index d13569d..f5ae5b0 100755 --- a/careless/build +++ b/careless/build @@ -9,9 +9,8 @@ pbuild::configure() { # uv fetches a standalone CPython instead; keep it inside PREFIX so the # venv's interpreter symlinks don't depend on the builder's home cache. UV="${UV:-$HOME/.local/bin/uv}" - # ~/.cache/uv hits the home disk quota; default the cache into PREFIX. - # Overridable so careless and careless-gpu can share one cache: - # UV_CACHE_DIR= modbuild build + # ~/.cache/uv hits the home disk quota; default the cache into PREFIX + # (overridable: UV_CACHE_DIR= modbuild build ) export UV_CACHE_DIR="${UV_CACHE_DIR:-$PREFIX/.uv-cache}" export UV_PYTHON_INSTALL_DIR="$PREFIX/python" "$UV" venv --python 3.12 "$PREFIX/venv" @@ -24,8 +23,9 @@ pbuild::compile() { pbuild::install() { UV="${UV:-$HOME/.local/bin/uv}" export UV_CACHE_DIR="${UV_CACHE_DIR:-$PREFIX/.uv-cache}" - # CPU version; the GPU build with the [cuda] extra is the careless-gpu module - "$UV" pip install --python "$PREFIX/venv/bin/python" "careless==${V_PKG}" + # [cuda] extra ships the NVIDIA stack (CUDA, cuDNN, ...) as pip wheels: + # uses the GPU when present (needs only the node driver), else falls back to CPU + "$UV" pip install --python "$PREFIX/venv/bin/python" "careless[cuda]==${V_PKG}" # only auto-remove the cache if it lives inside this PREFIX (never a shared one) [[ "$UV_CACHE_DIR" == "$PREFIX"* ]] && rm -rf "$UV_CACHE_DIR" || : } diff --git a/careless/modulefile b/careless/modulefile index 852264c..50cf9be 100644 --- a/careless/modulefile +++ b/careless/modulefile @@ -7,8 +7,9 @@ module-maintainer "MX Data " module-help " careless: scaling and merging of X-ray diffraction data using -approximate Bayesian inference (TensorFlow). CPU build; for -NVIDIA GPU nodes load careless-gpu instead. +approximate Bayesian inference (TensorFlow). Installed with the +[cuda] extra: uses NVIDIA GPUs when present (no cuda module +needed), falls back to CPU otherwise. " setenv CARELESS_ENV $PREFIX/venv