Skip to content

NERSC/Perlmutter: what it took to run lc reliably — proposed "HPC and venues" guidance #208

Description

@lhparker1

Notes from running a three-part lc analysis end to end on Perlmutter (lc 0.5.0rc2, direct mode — landlock unavailable there). Each item below cost real time to diagnose; none is documented today. Suggested home for the user-facing prose: the lightcone skill's diagnosis.md "HPC and venues" section, with the runtime-side items fixed or surfaced by lc itself.

Blocking

  1. Project location: GPFS home breaks commits. With the project on /global/homes, git-annex's sqlite keysdb returns disk I/O error whenever lc commits an output from a compute node (Repeatedly unable to open sqlite database .git/annex/keysdb/db). The commit phase loops for 10–25 min and dies; not one materialize commit ever succeeded there. On Lustre ($PSCRATCH) commits are instant. → Document: projects live on $PSCRATCH (and note the purge policy — annexed result bytes need a durable remote before publishing).
  2. uv cannot lock its cache from compute nodes. Could not acquire lock for ~/.cache/uv … Unknown error 524 (flock on GPFS). lc drives uv internally, so materialize fails on the node. → UV_CACHE_DIR=/tmp/uvcache (or lc could default the cache to a node-local path when it detects Slurm).
  3. Memory cgroup. srun -c 128 on a 256-thread node grants half the node's memory; a recipe with parallel prepare_sim OOM-killed the whole step. → --exclusive --mem=0; worth stating in the refusal that lc materialize prints for login nodes.
  4. Declared-input hashing. Declaring a 200 GB directory as a source: made lc status hash it for >27 min per invocation. → Guidance to declare only the files/shells a recipe actually reads (and perhaps a warning when a source exceeds some size).

Confusing but benign

  1. lc launches its dask worker via srun --overlap; every invocation ends with *** STEP … CANCELLED … DUE TO SIGNAL Killed *** and srun: error: … task 0: Killed. It is lc's own teardown, but it reads as an external kill (we chased a phantom process sweeper for an afternoon). A quieter teardown, or one line in the docs.
  2. A login-node srun client is fragile (arbiter/timeouts). The robust pattern was salloc … --no-shell, then ssh <node> 'nohup script &' with the script self-logging to $PSCRATCH; or sbatch -q regular (the interactive QOS refuses sbatch). Because outputs are committed at the end of an invocation, long chains should be split into short lc materialize <targets> stages so a kill loses one stage, not all.

Recovery

  1. After any killed run: stale .git/index.lock and .git/annex/keysdb/db-shm must be removed by hand before the next invocation; untracked results/ then trips the "uncommitted changes" refusal, whose git clean remedy is the right one.
  2. A materialize sitting at 0 % CPU with /proc/<pid>/wchan = cl_sync_io_wait is a Lustre outage, not an lc hang — worth a diagnosis-table row.

Related: #207 (nested-spec execution), LightconeResearch/agent-skills#37 (git layout for composed analyses).

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions