diff --git a/backends/atlas-sparkqwen/README.md b/backends/atlas-sparkqwen/README.md index c8057c5..b95866f 100644 --- a/backends/atlas-sparkqwen/README.md +++ b/backends/atlas-sparkqwen/README.md @@ -5,17 +5,17 @@ of NVIDIA DGX Spark systems, serving `nvidia/Qwen3.8-Flash-Next-NVFP4` as published (no overlay conversion, no separate drafter: speculation uses the checkpoint's own MTP head). This directory is **MIT orchestration only**: no Atlas engine source is committed here. The engine image is built from -`Enntity/sparkqwen` revision `8b28467324893583838871b6a6b6a28d3059e64f` -(install tree `4ccd961ecf09`) by that repository's `install/build.sh` and -published as `ghcr.io/enntity/atlas-sparkqwen:4ccd961ecf09`. The engine inside +`Enntity/sparkqwen` revision `0cf2436de5211b41edf4d92071180c75cec31dd8` +(install tree `e7268337a5c8`) by that repository's `install/build.sh` and +published as `ghcr.io/enntity/atlas-sparkqwen:e7268337a5c8`. The engine inside the image is AGPL-3.0-only; see [Credits and licenses](#credits-and-licenses). SparkQwen qualified RC16 on its own launcher; no live run through LLooM is recorded yet. ## Image digest -`pins.json` addresses `ghcr.io/enntity/atlas-sparkqwen@sha256:9408884dc4bf2c84b7dd097d62effc73f58fffc25a1d67db73d0b4e69516a7c0`, the GHCR -manifest digest of tag `4ccd961ecf09` (recorded 2026-10-13 with +`pins.json` addresses `ghcr.io/enntity/atlas-sparkqwen@sha256:63fcc9f8f87a3963aba91f0a5dbf2c1cf5efa1d809c4ab1b52bd5853979e73ed`, the GHCR +manifest digest of tag `e7268337a5c8` (recorded 2026-10-13 with `docker buildx imagetools inspect`). Both recipe members use the same reference as `bootstrap.image`. diff --git a/backends/atlas-sparkqwen/pins.json b/backends/atlas-sparkqwen/pins.json index 6107d03..deb6813 100644 --- a/backends/atlas-sparkqwen/pins.json +++ b/backends/atlas-sparkqwen/pins.json @@ -1,11 +1,11 @@ { "manifestVersion": 1, "status": "final", - "note": "Single pin manifest for the Atlas SparkQwen RC16 lane. Source, install tree, tag and model identities are final. image.reference is the GHCR manifest digest of ghcr.io/enntity/atlas-sparkqwen:4ccd961ecf09, also used as the recipe's bootstrap image. The normal install path addresses image.reference; the tag is source-build metadata (the first 12 characters of the git tree of install/ at the pinned revision) and the install-tree label is a contents check. A tag or label alone is never the artifact identity.", + "note": "Single pin manifest for the Atlas SparkQwen RC16 lane. Source, install tree, tag and model identities are final. image.reference is the GHCR manifest digest of ghcr.io/enntity/atlas-sparkqwen:e7268337a5c8, also used as the recipe's bootstrap image. The normal install path addresses image.reference; the tag is source-build metadata (the first 12 characters of the git tree of install/ at the pinned revision) and the install-tree label is a contents check. A tag or label alone is never the artifact identity.", "source": { "repo": "Enntity/sparkqwen", - "revision": "8b28467324893583838871b6a6b6a28d3059e64f", - "installTree": "4ccd961ecf09d86c9f13087e42592789b5f56182", + "revision": "0cf2436de5211b41edf4d92071180c75cec31dd8", + "installTree": "e7268337a5c8e77c874c7cb7be689f80a79946a5", "cloneUrl": "https://github.com/Enntity/sparkqwen.git", "buildScript": "install/build.sh" }, @@ -15,8 +15,8 @@ "commit": "1c43247d93ca050f02cb67b0603e88edfe3d92a5" }, "image": { - "reference": "ghcr.io/enntity/atlas-sparkqwen@sha256:9408884dc4bf2c84b7dd097d62effc73f58fffc25a1d67db73d0b4e69516a7c0", - "tag": "ghcr.io/enntity/atlas-sparkqwen:4ccd961ecf09", + "reference": "ghcr.io/enntity/atlas-sparkqwen@sha256:63fcc9f8f87a3963aba91f0a5dbf2c1cf5efa1d809c4ab1b52bd5853979e73ed", + "tag": "ghcr.io/enntity/atlas-sparkqwen:e7268337a5c8", "label": "io.enntity.sparkqwen.install-tree", "entrypoint": "/opt/atlas/serve.py", "profilePath": "/opt/atlas/profiles/8x262k.json", diff --git a/docs/recipes.md b/docs/recipes.md index 9de2af0..47273c6 100644 --- a/docs/recipes.md +++ b/docs/recipes.md @@ -576,9 +576,17 @@ lloom setup --recipe linux-nvidia-dgx-spark-2x-qwen38-flash-next-atlas --additiv lloom runtime-start qwen38-flash-next-atlas-cluster ``` +For shared hosts, the image accepts `SPARKQWEN_GPU_MEMORY_UTILIZATION=0.70` +through `0.95` in each physical runtime's Docker environment. Lower settings +leave room for host services and reduce the shared KV pool; the published +context/concurrency measurements apply to the default 0.88 allocation. Keep +the logical runtime, physical runtimes, and each placement member's +`resources.memoryGb` reservation consistent with the chosen deployment. +Do not raise the host memory safety limit to make an oversized cache fit. + The recipe is additive (no default model, no aliases, `keepWarm` false). Pins live in `backends/atlas-sparkqwen/pins.json` (source `Enntity/sparkqwen` -`8b284673`, install tree `4ccd961ecf09`). The GHCR manifest digest is pinned in the same manifest. +`0cf2436d`, install tree `e7268337a5c8`). The GHCR manifest digest is pinned in the same manifest. `node backends/atlas-sparkqwen/verify-pins.mjs`, setup step `verify-atlas-pins` and `install.sh` reject missing or placeholder identities. The installer only pulls that digest and verifies the image's arm64 architecture, diff --git a/recipes/linux-nvidia-dgx-spark-2x-qwen38-flash-next-atlas.json b/recipes/linux-nvidia-dgx-spark-2x-qwen38-flash-next-atlas.json index 7036ae6..09b7d69 100644 --- a/recipes/linux-nvidia-dgx-spark-2x-qwen38-flash-next-atlas.json +++ b/recipes/linux-nvidia-dgx-spark-2x-qwen38-flash-next-atlas.json @@ -14,12 +14,12 @@ "provenance": { "createdBy": "lloom", "generatedBy": "manual-curated", - "source": "SparkQwen RC16: Enntity/sparkqwen 8b28467324893583838871b6a6b6a28d3059e64f (install tree 4ccd961ecf09d86c9f13087e42592789b5f56182), engine Enntity/atlas sparkqwen/atlas-20261010-rc16 @ 1c43247d (AGPL-3.0-only, recorded in the image's /opt/atlas/source-manifest.json). The image is ghcr.io/enntity/atlas-sparkqwen:4ccd961ecf09, addressed by its GHCR manifest digest in pins.json. The engine argument vector ships inside the image as /opt/atlas/profiles/8x262k.json, selected with SPARKQWEN_PROFILE=8x262k: eight sequences of up to 262144 tokens, BF16 KV (about 3.19M pool tokens at the profile's 0.88 GPU memory utilization), prefix caching, MTP speculation (up to 7 drafts), content-loop steering. Model nvidia/Qwen3.8-Flash-Next-NVFP4 revision fc694b54fb0174e0913e6adf86691ef85a4ead47." + "source": "SparkQwen RC16: Enntity/sparkqwen 0cf2436de5211b41edf4d92071180c75cec31dd8 (install tree e7268337a5c8e77c874c7cb7be689f80a79946a5), engine Enntity/atlas sparkqwen/atlas-20261010-rc16 @ 1c43247d (AGPL-3.0-only, recorded in the image's /opt/atlas/source-manifest.json). The image is ghcr.io/enntity/atlas-sparkqwen:e7268337a5c8, addressed by its GHCR manifest digest in pins.json. The engine argument vector ships inside the image as /opt/atlas/profiles/8x262k.json, selected with SPARKQWEN_PROFILE=8x262k: eight sequences of up to 262144 tokens, BF16 KV (about 3.19M pool tokens at the profile's 0.88 GPU memory utilization), prefix caching, MTP speculation (up to 7 drafts), content-loop steering. Model nvidia/Qwen3.8-Flash-Next-NVFP4 revision fc694b54fb0174e0913e6adf86691ef85a4ead47." }, "links": [ { "rel": "upstream", - "href": "https://github.com/Enntity/sparkqwen/tree/8b28467324893583838871b6a6b6a28d3059e64f" + "href": "https://github.com/Enntity/sparkqwen/tree/0cf2436de5211b41edf4d92071180c75cec31dd8" }, { "rel": "engine", @@ -219,7 +219,7 @@ "warmup": false, "bootstrap": { "adapter": "docker", - "image": "ghcr.io/enntity/atlas-sparkqwen@sha256:9408884dc4bf2c84b7dd097d62effc73f58fffc25a1d67db73d0b4e69516a7c0", + "image": "ghcr.io/enntity/atlas-sparkqwen@sha256:63fcc9f8f87a3963aba91f0a5dbf2c1cf5efa1d809c4ab1b52bd5853979e73ed", "pull": false, "pullTimeoutMs": 3600000, "createArgs": [ @@ -320,7 +320,7 @@ }, "bootstrap": { "adapter": "docker", - "image": "ghcr.io/enntity/atlas-sparkqwen@sha256:9408884dc4bf2c84b7dd097d62effc73f58fffc25a1d67db73d0b4e69516a7c0", + "image": "ghcr.io/enntity/atlas-sparkqwen@sha256:63fcc9f8f87a3963aba91f0a5dbf2c1cf5efa1d809c4ab1b52bd5853979e73ed", "pull": false, "pullTimeoutMs": 3600000, "createArgs": [ diff --git a/test/atlas-sparkqwen-recipe.test.mjs b/test/atlas-sparkqwen-recipe.test.mjs index e2354f8..d1df343 100644 --- a/test/atlas-sparkqwen-recipe.test.mjs +++ b/test/atlas-sparkqwen-recipe.test.mjs @@ -323,10 +323,10 @@ assert.throws(() => materialize(missingFabric), /cluster\.nodes\[ennspark04\]\.f // ---- pins: final identities, pending digest, fail-closed gate --------------- assert.equal(pins.source.repo, 'Enntity/sparkqwen'); -assert.equal(pins.source.revision, '8b28467324893583838871b6a6b6a28d3059e64f'); -assert.equal(pins.source.installTree, '4ccd961ecf09d86c9f13087e42592789b5f56182'); +assert.equal(pins.source.revision, '0cf2436de5211b41edf4d92071180c75cec31dd8'); +assert.equal(pins.source.installTree, 'e7268337a5c8e77c874c7cb7be689f80a79946a5'); assert.equal(pins.engine.commit, '1c43247d93ca050f02cb67b0603e88edfe3d92a5'); -assert.equal(pins.image.tag, 'ghcr.io/enntity/atlas-sparkqwen:4ccd961ecf09'); +assert.equal(pins.image.tag, 'ghcr.io/enntity/atlas-sparkqwen:e7268337a5c8'); assert.equal(pins.image.tag, imageTagFor(pins)); assert.equal(pins.image.label, 'io.enntity.sparkqwen.install-tree'); assert.equal(pins.image.profilePath, '/opt/atlas/profiles/8x262k.json');