diff --git a/docs/GLM53_DFLASH7_PYTHON_OVERLAY_SPARKCACHE_TP4_QUICKSTART.md b/docs/GLM53_DFLASH7_PYTHON_OVERLAY_SPARKCACHE_TP4_QUICKSTART.md index 043c0ad9..51b5f6a6 100644 --- a/docs/GLM53_DFLASH7_PYTHON_OVERLAY_SPARKCACHE_TP4_QUICKSTART.md +++ b/docs/GLM53_DFLASH7_PYTHON_OVERLAY_SPARKCACHE_TP4_QUICKSTART.md @@ -12,7 +12,7 @@ store/restart/restore, or concurrency qualification. | vLLM native extensions and wheel metadata | `da4d7be6c97434f6942292ed8abbf4b32dc44355` | | vLLM Python source | `0b67266a0f37d6146a8403fb8482403c62f412d5`, tree `ba9484ccb33aa56e90ff2f447f15ca9b9da97639` | | B12X | `b1d541f9e71a35f030d45fae437630fff7507c2a`, tree `c69cdec1c59a08e8e0e549f930fa8abcfb5134ae` | -| SparkCache reconstructed-page placement | `5d571018de5b63a9a90e5c11e6d6e86bbff4a957`, tree `e864ed9ad64f771188fdb59aa9738e348134d636` | +| SparkCache reconstructed-page placement and canonical CUDA configuration | `b95aa8ab0068dc66a6892a5c311d7e9dd4a9c55a`, tree `723fc604d73911a9e907798fd7932e4fc9c95df5`, clean source SHA-256 `48e008ba0cbd12f1ffae1c28388ea83310f41c6219c955e13d63ab171290d8de` | | DFlash draft-loader separation | Patch SHA-256 `39b567013ee7aed79f63200ed460129587933dc77fb430decdf19f78178de279`, postimage SHA-256 `98acbae2b3bb4482d83f9637c163ce7c92707ccdf6561b7e431f23337f151cf4` | | Target | `local-inference-lab/GLM-5.3-Flash-NVFP4@520de24eabf507659eaef7c70f14fd584527facc` | | External draft | `incoai/GLM-5.3-Flash-DFlash2@dc77ff1c99eeb2df044ee3d4f0094eb033fee410`, BF16 weights SHA-256 `b33c03475ba7322cf398828f2d8d1be376df30dc05c6b40c28c8ea8da23e410b` | @@ -54,6 +54,9 @@ postimage SHA-256 `98acbae2b3bb4482d83f9637c163ce7c92707ccdf6561b7e431f23337f151cf4`. Both profiles remain unqualified until live four-rank gates pass. +SparkCache PR #26 accepts the canonical CUDA keys used by both profiles. No +local PR25 compatibility profile or legacy-key rewrite is part of this path. + ## Resolve the profile and inspect the plan Copy `scripts/config/glm53-flash-tp4-site.example.yaml` @@ -93,3 +96,9 @@ MTP profiles. `tail-cow-v1` also separates these entries from snapshot-v1 manifests. The two target-loader profiles share a namespace because loader choice does not change target or draft model state; each profile uses a different cache root and one-shot clear token while qualification is pending. + +Moving from SparkCache PR #25 to PR #26 does not change the namespace. The +checkpoint identities, publication schema, record vocabulary, digest salts, +parallel geometry, vLLM patches, lease contract, and CUDA placement ABI are +unchanged. Compatible PR25 `page-tail-cow-v1` entries remain eligible; only +the configuration vocabulary and SparkCache source receipt change. diff --git a/runtime/glm53-flash-dflash7-python-overlay/README.md b/runtime/glm53-flash-dflash7-python-overlay/README.md index 89df853b..22deca06 100644 --- a/runtime/glm53-flash-dflash7-python-overlay/README.md +++ b/runtime/glm53-flash-dflash7-python-overlay/README.md @@ -12,8 +12,8 @@ The image combines these exact roles: `0b67266a0f37d6146a8403fb8482403c62f412d5`; - B12X `b1d541f9e71a35f030d45fae437630fff7507c2a`; - SparkCache reconstructed-page placement source - `5d571018de5b63a9a90e5c11e6d6e86bbff4a957`, Git tree - `e864ed9ad64f771188fdb59aa9738e348134d636`; + `b95aa8ab0068dc66a6892a5c311d7e9dd4a9c55a`, Git tree + `723fc604d73911a9e907798fd7932e4fc9c95df5`; - external BF16 DFlash2 weights with SHA-256 `b33c03475ba7322cf398828f2d8d1be376df30dc05c6b40c28c8ea8da23e410b`. @@ -43,3 +43,11 @@ profile uses global fastsafetensors for the target and an exact `draft_load_config` selecting safetensors for DFlash. The image applies and verifies the draft-loader patch before installing SparkCache patches. See `docs/GLM53_DFLASH7_PYTHON_OVERLAY_SPARKCACHE_TP4_QUICKSTART.md`. + +The SparkCache source accepts the canonical CUDA configuration keys directly. +No PR25 compatibility profile or legacy-key translation is required by these +profiles. + +The PR26 source update does not change cache identity, page-tail publication, +record geometry, vLLM patch bytes, the lease contract, or the CUDA placement +ABI. Existing compatible PR25 cache entries remain in the same namespace. diff --git a/runtime/glm53-flash-dflash7-python-overlay/pins.json b/runtime/glm53-flash-dflash7-python-overlay/pins.json index ce7c93ea..b0587417 100644 --- a/runtime/glm53-flash-dflash7-python-overlay/pins.json +++ b/runtime/glm53-flash-dflash7-python-overlay/pins.json @@ -77,9 +77,17 @@ }, "sparkcache": { "repository": "https://github.com/FujitsuPolycom/sparkcache.git", - "commit": "5d571018de5b63a9a90e5c11e6d6e86bbff4a957", - "tree": "e864ed9ad64f771188fdb59aa9738e348134d636", - "source_tree_sha256": "f7c0565521fddeff7085e4cc08043cb8d1e2bde33abc67f83b8608a162d05b88", + "commit": "b95aa8ab0068dc66a6892a5c311d7e9dd4a9c55a", + "tree": "723fc604d73911a9e907798fd7932e4fc9c95df5", + "source_tree_sha256": "48e008ba0cbd12f1ffae1c28388ea83310f41c6219c955e13d63ab171290d8de", + "cuda_config_schema": "canonical-v1", + "canonical_cuda_config_keys": [ + "spark_cache_cuda_restore", + "spark_cache_cuda_placement_library", + "spark_cache_cuda_placement_library_sha256", + "spark_cache_cuda_placement_arena_bytes", + "spark_cache_cuda_restore_io_workers" + ], "contract": { "path": "sparkcache/runtime_patches/vllm-kv-block-lease-contract-glm53-b12x-kda-adaptive-mtp.json", "sha256": "6defde9551cbb586fd09bb2d3020495531b6573397875a767eaae1dbad126024", diff --git a/runtime/glm53-flash-dflash7-python-overlay/prepare_context.py b/runtime/glm53-flash-dflash7-python-overlay/prepare_context.py index 74e9da66..786fa7e4 100644 --- a/runtime/glm53-flash-dflash7-python-overlay/prepare_context.py +++ b/runtime/glm53-flash-dflash7-python-overlay/prepare_context.py @@ -47,6 +47,15 @@ def _longpath_run(argv, *, cwd=None): _original_run = common.run +_original_copy_file = common.copy_file + + +def _routed_copy_file(source: Path, destination: Path) -> None: + """Place the DFlash7 pins in the shared prepared-context topology.""" + + if source == COMMON / "pins.json": + source = PINS + _original_copy_file(source, destination) def _render_containerfile() -> str: @@ -79,6 +88,15 @@ def _render_containerfile() -> str: if old not in text: raise PrepareError(f"shared Containerfile omits required text: {old}") text = text.replace(old, new) + deployment = ( + 'org.sparkcache.deployment-profile="glm53-flash-dflash7-python-overlay"' + ) + if deployment not in text: + raise PrepareError("rendered Containerfile omits the DFlash7 deployment label") + text = text.replace( + deployment, + 'org.sparkcache.cuda-config-schema="canonical-v1" \\\n ' + deployment, + ) return text @@ -96,6 +114,17 @@ def _render_verify_image() -> str: if old not in text: raise PrepareError(f"shared image verifier omits required text: {old}") text = text.replace(old, new) + deployment = ( + '"org.sparkcache.deployment-profile": ' + '"glm53-flash-dflash7-python-overlay",' + ) + if deployment not in text: + raise PrepareError("rendered verifier omits the DFlash7 deployment label") + text = text.replace( + deployment, + '"org.sparkcache.cuda-config-schema": "canonical-v1",\n' + f" {deployment}", + ) return text @@ -132,9 +161,11 @@ def _replace_runtime_files(context: Path) -> None: def prepare(output: Path, *, repository_root: Path = ROOT) -> dict[str, Any]: original_pins = common.PINS original_run = common.run + original_copy_file = common.copy_file try: common.PINS = PINS common.run = _longpath_run + common.copy_file = _routed_copy_file common.prepare(output, repository_root=repository_root) _replace_runtime_files(output) common.verify_context(output) @@ -142,6 +173,7 @@ def prepare(output: Path, *, repository_root: Path = ROOT) -> dict[str, Any]: finally: common.PINS = original_pins common.run = original_run + common.copy_file = original_copy_file def verify_context(context: Path) -> dict[str, Any]: diff --git a/runtime/glm53-flash-dflash7-python-overlay/test_dflash7_python_overlay.py b/runtime/glm53-flash-dflash7-python-overlay/test_dflash7_python_overlay.py index 1d0816f7..29a17977 100644 --- a/runtime/glm53-flash-dflash7-python-overlay/test_dflash7_python_overlay.py +++ b/runtime/glm53-flash-dflash7-python-overlay/test_dflash7_python_overlay.py @@ -33,8 +33,22 @@ def test_pins_bind_the_exact_dflash7_composition() -> None: "b1d541f9e71a35f030d45fae437630fff7507c2a" ) assert pins["sparkcache"]["commit"] == ( - "5d571018de5b63a9a90e5c11e6d6e86bbff4a957" + "b95aa8ab0068dc66a6892a5c311d7e9dd4a9c55a" ) + assert pins["sparkcache"]["tree"] == ( + "723fc604d73911a9e907798fd7932e4fc9c95df5" + ) + assert pins["sparkcache"]["source_tree_sha256"] == ( + "48e008ba0cbd12f1ffae1c28388ea83310f41c6219c955e13d63ab171290d8de" + ) + assert pins["sparkcache"]["cuda_config_schema"] == "canonical-v1" + assert pins["sparkcache"]["canonical_cuda_config_keys"] == [ + "spark_cache_cuda_restore", + "spark_cache_cuda_placement_library", + "spark_cache_cuda_placement_library_sha256", + "spark_cache_cuda_placement_arena_bytes", + "spark_cache_cuda_restore_io_workers", + ] workload = pins["workload"] assert workload["role"] == "external-dflash7" assert workload["draft"]["weights_sha256"] == ( @@ -59,6 +73,7 @@ def test_rendered_image_metadata_names_dflash7_not_adaptive_mtp() -> None: recipe = prepare._render_containerfile() assert "SparkRing GLM-5.3 DFlash7 Python overlay" in recipe assert "glm53-flash-dflash7-python-overlay" in recipe + assert 'org.sparkcache.cuda-config-schema="canonical-v1"' in recipe assert "010-dflash-draft-load-config.patch" in recipe assert "98acbae2b3bb4482d83f9637c163ce7c92707ccdf6561b7e431f23337f151cf4" in recipe label_section = recipe[recipe.index("LABEL org.opencontainers.image.title=") :] @@ -74,6 +89,7 @@ def test_verifier_requires_the_dflash7_deployment_label() -> None: assert labels["org.sparkcache.deployment-profile"] == ( "glm53-flash-dflash7-python-overlay" ) + assert labels["org.sparkcache.cuda-config-schema"] == "canonical-v1" assert labels["org.jovian.vllm.commit"] != labels[ "org.sparkring.vllm.python.commit" ] diff --git a/runtime/glm53-flash-dflash7-python-overlay/verify_image.py b/runtime/glm53-flash-dflash7-python-overlay/verify_image.py index 771049c7..85b8b01a 100644 --- a/runtime/glm53-flash-dflash7-python-overlay/verify_image.py +++ b/runtime/glm53-flash-dflash7-python-overlay/verify_image.py @@ -33,6 +33,7 @@ def expected_output_labels(pins: dict[str, Any]) -> dict[str, str]: labels["org.sparkcache.deployment-profile"] = ( "glm53-flash-dflash7-python-overlay" ) + labels["org.sparkcache.cuda-config-schema"] = "canonical-v1" return labels diff --git a/scripts/config/README.md b/scripts/config/README.md index 314855ba..4b62783d 100644 --- a/scripts/config/README.md +++ b/scripts/config/README.md @@ -107,6 +107,8 @@ SparkCache CUDA restore with page-tail copy-on-write publication. Resolve either profile with `scripts/prepare_glm53_dflash7_python_overlay_profile.py`. Follow the [DFlash7 Python-overlay quickstart](../../docs/GLM53_DFLASH7_PYTHON_OVERLAY_SPARKCACHE_TP4_QUICKSTART.md). +Both templates use only SparkCache PR #26 canonical CUDA keys; they do not +require a PR25 compatibility profile. ## DeepSeek-V4-Flash-0731 diff --git a/scripts/config/glm53-flash-dflash7-python-overlay-fastsafetensors-sparkcache-tp4-dcp1.example.json b/scripts/config/glm53-flash-dflash7-python-overlay-fastsafetensors-sparkcache-tp4-dcp1.example.json index 428f174f..18ab06ef 100644 --- a/scripts/config/glm53-flash-dflash7-python-overlay-fastsafetensors-sparkcache-tp4-dcp1.example.json +++ b/scripts/config/glm53-flash-dflash7-python-overlay-fastsafetensors-sparkcache-tp4-dcp1.example.json @@ -148,9 +148,9 @@ "max_num_seqs": "32", "sparkcache_publication_schema": "tail-cow-v1", "sparkcache_effective_publication_schema": "page-tail-cow-v1", - "sparkcache_source_sha256": "f7c0565521fddeff7085e4cc08043cb8d1e2bde33abc67f83b8608a162d05b88", - "sparkcache_source_revision": "5d571018de5b63a9a90e5c11e6d6e86bbff4a957", - "sparkcache_source_tree": "e864ed9ad64f771188fdb59aa9738e348134d636", + "sparkcache_source_sha256": "48e008ba0cbd12f1ffae1c28388ea83310f41c6219c955e13d63ab171290d8de", + "sparkcache_source_revision": "b95aa8ab0068dc66a6892a5c311d7e9dd4a9c55a", + "sparkcache_source_tree": "723fc604d73911a9e907798fd7932e4fc9c95df5", "vllm_native_revision": "da4d7be6c97434f6942292ed8abbf4b32dc44355", "vllm_python_revision": "0b67266a0f37d6146a8403fb8482403c62f412d5", "vllm_python_tree": "ba9484ccb33aa56e90ff2f447f15ca9b9da97639", @@ -175,10 +175,11 @@ "org.opencontainers.image.base.name": "ghcr.io/fujitsupolycom/sparkring-glm53-runtime@sha256:864adfe68f458223e186a19844ac80c7adc7365e5db1f25e109b85fc19850dcd", "org.sparkring.base.image-id": "sha256:7e8c0ebcb2001efb4cdab0ec9d20d53972e62db3688230044e22e61ffb1d35d5", "org.sparkcache.deployment-profile": "glm53-flash-dflash7-python-overlay", + "org.sparkcache.cuda-config-schema": "canonical-v1", "org.sparkcache.cuda-placement-library-sha256": "REPLACE_WITH_CUDA_PLACEMENT_LIBRARY_SHA256", - "org.sparkcache.source-revision": "5d571018de5b63a9a90e5c11e6d6e86bbff4a957", - "org.sparkcache.source-tree": "e864ed9ad64f771188fdb59aa9738e348134d636", - "org.sparkcache.source-sha256": "f7c0565521fddeff7085e4cc08043cb8d1e2bde33abc67f83b8608a162d05b88", + "org.sparkcache.source-revision": "b95aa8ab0068dc66a6892a5c311d7e9dd4a9c55a", + "org.sparkcache.source-tree": "723fc604d73911a9e907798fd7932e4fc9c95df5", + "org.sparkcache.source-sha256": "48e008ba0cbd12f1ffae1c28388ea83310f41c6219c955e13d63ab171290d8de", "org.sparkcache.vllm-contract-sha256": "6defde9551cbb586fd09bb2d3020495531b6573397875a767eaae1dbad126024", "org.sparkring.source-receipt-sha256": "REPLACE_WITH_SOURCE_RECEIPT_SHA256", "org.sparkring.nccl.commit": "73cf112295c33aee2b895f329f592f2a9b4b0f97", @@ -188,6 +189,6 @@ "attestation_hook": [ "/bin/sh", "-ec", - "test -f /models/target/config.json && test -f /models/target/model.safetensors.index.json && test \"$(sha256sum /models/target/config.json | cut -d ' ' -f1)\" = 676382abd1e90a6c85f0c8f33d45441ecd45fd514fd7b63ce5610e732d8e4996 && test \"$(sha256sum /models/target/model.safetensors.index.json | cut -d ' ' -f1)\" = 0d1d9e6b226e76520e182de10d4e7194cc885c5cb1bf885bb90de1916ce312cb && test -f /dflash-draft/config.json && test -f /dflash-draft/model.safetensors && test \"$(sha256sum /dflash-draft/config.json | cut -d ' ' -f1)\" = c4aeac0101196a6e26705b34c45230bcd0c7c68ee2d2d1efdb242087f3712573 && test \"$(sha256sum /dflash-draft/model.safetensors | cut -d ' ' -f1)\" = b33c03475ba7322cf398828f2d8d1be376df30dc05c6b40c28c8ea8da23e410b && test \"$(sha256sum /opt/sparkring/nccl/libnccl.so.2 | cut -d ' ' -f1)\" = 5f1c3f10d5ace66d4ba584415bbfe42b6ac1a0a9116a3b81dcbe50516ad924b3 && grep -q '\"tail-cow-v1\"' /opt/sparkcache-src/sparkcache/spark_context_cache_config.py && test \"$(sha256sum /opt/sparkring/runtime/python-overlay/vllm-python-overlay.json | cut -d ' ' -f1)\" = e5e528288b173399611a4930fecc4182b7208bc1564881d52ca5d2c5c4ae0f6a && test \"$(sha256sum /opt/sparkring/runtime/python-overlay/source-receipt.json | cut -d ' ' -f1)\" = REPLACE_WITH_SOURCE_RECEIPT_SHA256 && test \"$(python3 -c 'import json; print(json.load(open(\"/opt/sparkring/runtime/python-overlay/retained-native.json\", encoding=\"utf-8\"))[\"native_elf_manifest_sha256\"])')\" = REPLACE_WITH_VLLM_NATIVE_ELF_MANIFEST_SHA256 && test \"$(python3 -c 'import json; print(json.load(open(\"/opt/sparkring/runtime/python-overlay/retained-native.json\", encoding=\"utf-8\"))[\"native_dispatch_manifest_sha256\"])')\" = REPLACE_WITH_VLLM_NATIVE_DISPATCH_MANIFEST_SHA256 && test \"$(cat /opt/sparkring/runtime/python-overlay/sparkcache-source-tree.sha256)\" = f7c0565521fddeff7085e4cc08043cb8d1e2bde33abc67f83b8608a162d05b88 && test \"$(sha256sum /opt/sparkcache-src/sparkcache/runtime_patches/vllm-kv-block-lease-contract-glm53-b12x-kda-adaptive-mtp.json | cut -d ' ' -f1)\" = 6defde9551cbb586fd09bb2d3020495531b6573397875a767eaae1dbad126024 && test \"$(sha256sum /opt/sparkcache-src/sparkcache/native/build-cuda/libspark_cache_placement.so | cut -d ' ' -f1)\" = REPLACE_WITH_CUDA_PLACEMENT_LIBRARY_SHA256 && python3 /opt/sparkcache-src/sparkcache/runtime_patches/verify_lease_contract.py --vllm-root /usr/local/lib/python3.12/dist-packages --contract /opt/sparkcache-src/sparkcache/runtime_patches/vllm-kv-block-lease-contract-glm53-b12x-kda-adaptive-mtp.json" + "test -f /models/target/config.json && test -f /models/target/model.safetensors.index.json && test \"$(sha256sum /models/target/config.json | cut -d ' ' -f1)\" = 676382abd1e90a6c85f0c8f33d45441ecd45fd514fd7b63ce5610e732d8e4996 && test \"$(sha256sum /models/target/model.safetensors.index.json | cut -d ' ' -f1)\" = 0d1d9e6b226e76520e182de10d4e7194cc885c5cb1bf885bb90de1916ce312cb && test -f /dflash-draft/config.json && test -f /dflash-draft/model.safetensors && test \"$(sha256sum /dflash-draft/config.json | cut -d ' ' -f1)\" = c4aeac0101196a6e26705b34c45230bcd0c7c68ee2d2d1efdb242087f3712573 && test \"$(sha256sum /dflash-draft/model.safetensors | cut -d ' ' -f1)\" = b33c03475ba7322cf398828f2d8d1be376df30dc05c6b40c28c8ea8da23e410b && test \"$(sha256sum /opt/sparkring/nccl/libnccl.so.2 | cut -d ' ' -f1)\" = 5f1c3f10d5ace66d4ba584415bbfe42b6ac1a0a9116a3b81dcbe50516ad924b3 && grep -q '\"tail-cow-v1\"' /opt/sparkcache-src/sparkcache/spark_context_cache_config.py && test \"$(sha256sum /opt/sparkring/runtime/python-overlay/vllm-python-overlay.json | cut -d ' ' -f1)\" = e5e528288b173399611a4930fecc4182b7208bc1564881d52ca5d2c5c4ae0f6a && test \"$(sha256sum /opt/sparkring/runtime/python-overlay/source-receipt.json | cut -d ' ' -f1)\" = REPLACE_WITH_SOURCE_RECEIPT_SHA256 && test \"$(python3 -c 'import json; print(json.load(open(\"/opt/sparkring/runtime/python-overlay/retained-native.json\", encoding=\"utf-8\"))[\"native_elf_manifest_sha256\"])')\" = REPLACE_WITH_VLLM_NATIVE_ELF_MANIFEST_SHA256 && test \"$(python3 -c 'import json; print(json.load(open(\"/opt/sparkring/runtime/python-overlay/retained-native.json\", encoding=\"utf-8\"))[\"native_dispatch_manifest_sha256\"])')\" = REPLACE_WITH_VLLM_NATIVE_DISPATCH_MANIFEST_SHA256 && test \"$(cat /opt/sparkring/runtime/python-overlay/sparkcache-source-tree.sha256)\" = 48e008ba0cbd12f1ffae1c28388ea83310f41c6219c955e13d63ab171290d8de && test \"$(sha256sum /opt/sparkcache-src/sparkcache/runtime_patches/vllm-kv-block-lease-contract-glm53-b12x-kda-adaptive-mtp.json | cut -d ' ' -f1)\" = 6defde9551cbb586fd09bb2d3020495531b6573397875a767eaae1dbad126024 && test \"$(sha256sum /opt/sparkcache-src/sparkcache/native/build-cuda/libspark_cache_placement.so | cut -d ' ' -f1)\" = REPLACE_WITH_CUDA_PLACEMENT_LIBRARY_SHA256 && python3 /opt/sparkcache-src/sparkcache/runtime_patches/verify_lease_contract.py --vllm-root /usr/local/lib/python3.12/dist-packages --contract /opt/sparkcache-src/sparkcache/runtime_patches/vllm-kv-block-lease-contract-glm53-b12x-kda-adaptive-mtp.json" ] } diff --git a/scripts/config/glm53-flash-dflash7-python-overlay-safetensors-sparkcache-tp4-dcp1.example.json b/scripts/config/glm53-flash-dflash7-python-overlay-safetensors-sparkcache-tp4-dcp1.example.json index b7d699fc..4f107b95 100644 --- a/scripts/config/glm53-flash-dflash7-python-overlay-safetensors-sparkcache-tp4-dcp1.example.json +++ b/scripts/config/glm53-flash-dflash7-python-overlay-safetensors-sparkcache-tp4-dcp1.example.json @@ -145,9 +145,9 @@ "max_num_seqs": "32", "sparkcache_publication_schema": "tail-cow-v1", "sparkcache_effective_publication_schema": "page-tail-cow-v1", - "sparkcache_source_sha256": "f7c0565521fddeff7085e4cc08043cb8d1e2bde33abc67f83b8608a162d05b88", - "sparkcache_source_revision": "5d571018de5b63a9a90e5c11e6d6e86bbff4a957", - "sparkcache_source_tree": "e864ed9ad64f771188fdb59aa9738e348134d636", + "sparkcache_source_sha256": "48e008ba0cbd12f1ffae1c28388ea83310f41c6219c955e13d63ab171290d8de", + "sparkcache_source_revision": "b95aa8ab0068dc66a6892a5c311d7e9dd4a9c55a", + "sparkcache_source_tree": "723fc604d73911a9e907798fd7932e4fc9c95df5", "vllm_native_revision": "da4d7be6c97434f6942292ed8abbf4b32dc44355", "vllm_python_revision": "0b67266a0f37d6146a8403fb8482403c62f412d5", "vllm_python_tree": "ba9484ccb33aa56e90ff2f447f15ca9b9da97639", @@ -172,10 +172,11 @@ "org.opencontainers.image.base.name": "ghcr.io/fujitsupolycom/sparkring-glm53-runtime@sha256:864adfe68f458223e186a19844ac80c7adc7365e5db1f25e109b85fc19850dcd", "org.sparkring.base.image-id": "sha256:7e8c0ebcb2001efb4cdab0ec9d20d53972e62db3688230044e22e61ffb1d35d5", "org.sparkcache.deployment-profile": "glm53-flash-dflash7-python-overlay", + "org.sparkcache.cuda-config-schema": "canonical-v1", "org.sparkcache.cuda-placement-library-sha256": "REPLACE_WITH_CUDA_PLACEMENT_LIBRARY_SHA256", - "org.sparkcache.source-revision": "5d571018de5b63a9a90e5c11e6d6e86bbff4a957", - "org.sparkcache.source-tree": "e864ed9ad64f771188fdb59aa9738e348134d636", - "org.sparkcache.source-sha256": "f7c0565521fddeff7085e4cc08043cb8d1e2bde33abc67f83b8608a162d05b88", + "org.sparkcache.source-revision": "b95aa8ab0068dc66a6892a5c311d7e9dd4a9c55a", + "org.sparkcache.source-tree": "723fc604d73911a9e907798fd7932e4fc9c95df5", + "org.sparkcache.source-sha256": "48e008ba0cbd12f1ffae1c28388ea83310f41c6219c955e13d63ab171290d8de", "org.sparkcache.vllm-contract-sha256": "6defde9551cbb586fd09bb2d3020495531b6573397875a767eaae1dbad126024", "org.sparkring.source-receipt-sha256": "REPLACE_WITH_SOURCE_RECEIPT_SHA256", "org.sparkring.nccl.commit": "73cf112295c33aee2b895f329f592f2a9b4b0f97", @@ -185,6 +186,6 @@ "attestation_hook": [ "/bin/sh", "-ec", - "test -f /models/target/config.json && test -f /models/target/model.safetensors.index.json && test \"$(sha256sum /models/target/config.json | cut -d ' ' -f1)\" = 676382abd1e90a6c85f0c8f33d45441ecd45fd514fd7b63ce5610e732d8e4996 && test \"$(sha256sum /models/target/model.safetensors.index.json | cut -d ' ' -f1)\" = 0d1d9e6b226e76520e182de10d4e7194cc885c5cb1bf885bb90de1916ce312cb && test -f /dflash-draft/config.json && test -f /dflash-draft/model.safetensors && test \"$(sha256sum /dflash-draft/config.json | cut -d ' ' -f1)\" = c4aeac0101196a6e26705b34c45230bcd0c7c68ee2d2d1efdb242087f3712573 && test \"$(sha256sum /dflash-draft/model.safetensors | cut -d ' ' -f1)\" = b33c03475ba7322cf398828f2d8d1be376df30dc05c6b40c28c8ea8da23e410b && test \"$(sha256sum /opt/sparkring/nccl/libnccl.so.2 | cut -d ' ' -f1)\" = 5f1c3f10d5ace66d4ba584415bbfe42b6ac1a0a9116a3b81dcbe50516ad924b3 && grep -q '\"tail-cow-v1\"' /opt/sparkcache-src/sparkcache/spark_context_cache_config.py && test \"$(sha256sum /opt/sparkring/runtime/python-overlay/vllm-python-overlay.json | cut -d ' ' -f1)\" = e5e528288b173399611a4930fecc4182b7208bc1564881d52ca5d2c5c4ae0f6a && test \"$(sha256sum /opt/sparkring/runtime/python-overlay/source-receipt.json | cut -d ' ' -f1)\" = REPLACE_WITH_SOURCE_RECEIPT_SHA256 && test \"$(python3 -c 'import json; print(json.load(open(\"/opt/sparkring/runtime/python-overlay/retained-native.json\", encoding=\"utf-8\"))[\"native_elf_manifest_sha256\"])')\" = REPLACE_WITH_VLLM_NATIVE_ELF_MANIFEST_SHA256 && test \"$(python3 -c 'import json; print(json.load(open(\"/opt/sparkring/runtime/python-overlay/retained-native.json\", encoding=\"utf-8\"))[\"native_dispatch_manifest_sha256\"])')\" = REPLACE_WITH_VLLM_NATIVE_DISPATCH_MANIFEST_SHA256 && test \"$(cat /opt/sparkring/runtime/python-overlay/sparkcache-source-tree.sha256)\" = f7c0565521fddeff7085e4cc08043cb8d1e2bde33abc67f83b8608a162d05b88 && test \"$(sha256sum /opt/sparkcache-src/sparkcache/runtime_patches/vllm-kv-block-lease-contract-glm53-b12x-kda-adaptive-mtp.json | cut -d ' ' -f1)\" = 6defde9551cbb586fd09bb2d3020495531b6573397875a767eaae1dbad126024 && test \"$(sha256sum /opt/sparkcache-src/sparkcache/native/build-cuda/libspark_cache_placement.so | cut -d ' ' -f1)\" = REPLACE_WITH_CUDA_PLACEMENT_LIBRARY_SHA256 && python3 /opt/sparkcache-src/sparkcache/runtime_patches/verify_lease_contract.py --vllm-root /usr/local/lib/python3.12/dist-packages --contract /opt/sparkcache-src/sparkcache/runtime_patches/vllm-kv-block-lease-contract-glm53-b12x-kda-adaptive-mtp.json" + "test -f /models/target/config.json && test -f /models/target/model.safetensors.index.json && test \"$(sha256sum /models/target/config.json | cut -d ' ' -f1)\" = 676382abd1e90a6c85f0c8f33d45441ecd45fd514fd7b63ce5610e732d8e4996 && test \"$(sha256sum /models/target/model.safetensors.index.json | cut -d ' ' -f1)\" = 0d1d9e6b226e76520e182de10d4e7194cc885c5cb1bf885bb90de1916ce312cb && test -f /dflash-draft/config.json && test -f /dflash-draft/model.safetensors && test \"$(sha256sum /dflash-draft/config.json | cut -d ' ' -f1)\" = c4aeac0101196a6e26705b34c45230bcd0c7c68ee2d2d1efdb242087f3712573 && test \"$(sha256sum /dflash-draft/model.safetensors | cut -d ' ' -f1)\" = b33c03475ba7322cf398828f2d8d1be376df30dc05c6b40c28c8ea8da23e410b && test \"$(sha256sum /opt/sparkring/nccl/libnccl.so.2 | cut -d ' ' -f1)\" = 5f1c3f10d5ace66d4ba584415bbfe42b6ac1a0a9116a3b81dcbe50516ad924b3 && grep -q '\"tail-cow-v1\"' /opt/sparkcache-src/sparkcache/spark_context_cache_config.py && test \"$(sha256sum /opt/sparkring/runtime/python-overlay/vllm-python-overlay.json | cut -d ' ' -f1)\" = e5e528288b173399611a4930fecc4182b7208bc1564881d52ca5d2c5c4ae0f6a && test \"$(sha256sum /opt/sparkring/runtime/python-overlay/source-receipt.json | cut -d ' ' -f1)\" = REPLACE_WITH_SOURCE_RECEIPT_SHA256 && test \"$(python3 -c 'import json; print(json.load(open(\"/opt/sparkring/runtime/python-overlay/retained-native.json\", encoding=\"utf-8\"))[\"native_elf_manifest_sha256\"])')\" = REPLACE_WITH_VLLM_NATIVE_ELF_MANIFEST_SHA256 && test \"$(python3 -c 'import json; print(json.load(open(\"/opt/sparkring/runtime/python-overlay/retained-native.json\", encoding=\"utf-8\"))[\"native_dispatch_manifest_sha256\"])')\" = REPLACE_WITH_VLLM_NATIVE_DISPATCH_MANIFEST_SHA256 && test \"$(cat /opt/sparkring/runtime/python-overlay/sparkcache-source-tree.sha256)\" = 48e008ba0cbd12f1ffae1c28388ea83310f41c6219c955e13d63ab171290d8de && test \"$(sha256sum /opt/sparkcache-src/sparkcache/runtime_patches/vllm-kv-block-lease-contract-glm53-b12x-kda-adaptive-mtp.json | cut -d ' ' -f1)\" = 6defde9551cbb586fd09bb2d3020495531b6573397875a767eaae1dbad126024 && test \"$(sha256sum /opt/sparkcache-src/sparkcache/native/build-cuda/libspark_cache_placement.so | cut -d ' ' -f1)\" = REPLACE_WITH_CUDA_PLACEMENT_LIBRARY_SHA256 && python3 /opt/sparkcache-src/sparkcache/runtime_patches/verify_lease_contract.py --vllm-root /usr/local/lib/python3.12/dist-packages --contract /opt/sparkcache-src/sparkcache/runtime_patches/vllm-kv-block-lease-contract-glm53-b12x-kda-adaptive-mtp.json" ] } diff --git a/scripts/prepare_glm53_dflash7_python_overlay_profile.py b/scripts/prepare_glm53_dflash7_python_overlay_profile.py index 9af06dc8..8ab96506 100644 --- a/scripts/prepare_glm53_dflash7_python_overlay_profile.py +++ b/scripts/prepare_glm53_dflash7_python_overlay_profile.py @@ -42,10 +42,10 @@ DFLASH_LOADER_POSTIMAGE_SHA256 = ( "98acbae2b3bb4482d83f9637c163ce7c92707ccdf6561b7e431f23337f151cf4" ) -SPARKCACHE_COMMIT = "5d571018de5b63a9a90e5c11e6d6e86bbff4a957" -SPARKCACHE_TREE = "e864ed9ad64f771188fdb59aa9738e348134d636" +SPARKCACHE_COMMIT = "b95aa8ab0068dc66a6892a5c311d7e9dd4a9c55a" +SPARKCACHE_TREE = "723fc604d73911a9e907798fd7932e4fc9c95df5" SPARKCACHE_SOURCE_SHA256 = ( - "f7c0565521fddeff7085e4cc08043cb8d1e2bde33abc67f83b8608a162d05b88" + "48e008ba0cbd12f1ffae1c28388ea83310f41c6219c955e13d63ab171290d8de" ) LEASE_CONTRACT_SHA256 = ( "6defde9551cbb586fd09bb2d3020495531b6573397875a767eaae1dbad126024" @@ -205,6 +205,7 @@ def resolve( "org.opencontainers.image.base.name": PUBLIC_BASE, "org.sparkring.base.image-id": PUBLIC_BASE_ID, "org.sparkcache.deployment-profile": "glm53-flash-dflash7-python-overlay", + "org.sparkcache.cuda-config-schema": "canonical-v1", "org.sparkcache.source-revision": SPARKCACHE_COMMIT, "org.sparkcache.source-tree": SPARKCACHE_TREE, "org.sparkcache.source-sha256": SPARKCACHE_SOURCE_SHA256, diff --git a/scripts/test_prepare_glm53_dflash7_python_overlay_profile.py b/scripts/test_prepare_glm53_dflash7_python_overlay_profile.py index c3c311e3..b5498968 100644 --- a/scripts/test_prepare_glm53_dflash7_python_overlay_profile.py +++ b/scripts/test_prepare_glm53_dflash7_python_overlay_profile.py @@ -144,6 +144,7 @@ def test_resolved_profile_requires_dflash7_image_labels() -> None: assert labels["org.sparkcache.deployment-profile"] == ( "glm53-flash-dflash7-python-overlay" ) + assert labels["org.sparkcache.cuda-config-schema"] == "canonical-v1" assert labels["org.sparkring.vllm.dflash-draft-loader-patch-sha256"] == ( DFLASH_LOADER_PATCH_SHA256 ) @@ -208,3 +209,5 @@ def test_quickstart_names_both_loader_statuses_and_exact_builder() -> None: assert "implemented" in guide and "not qualified" in guide assert DFLASH_WEIGHTS_SHA256 in guide assert DFLASH_LOADER_PATCH_SHA256 in guide + assert "does not change the namespace" in guide + assert "PR25 compatibility profile" in guide